2013-02-25 66 views
0

我有一个咨询即时试图实现一个问题:如何显示来自一个表中的所有记录,即使它们不匹配WHERE子句与JOIN

SELECT [columns] FROM table1 LEFT/RIGHT JOIN table2 ON table1.id_user = table2.id [WHERE clause] GROUP BY column 

什么,我想这个协商的一个例子做如下图所示:

具有table1的这个记录:

ID | id_user |用户|值

1 | 1 | name1 | 10

2 | 1 | name1 | 10

3 | 1 | name1 | 11

4 | 1 | name1 | 10

5 | 2 | name2 | 11

6 | 2 | name2 | 11对

这那些在表2:

ID |用户

1 | name1

2 | NAME2

我想获得给定的值,每个用户有多少条记录存在,exmample如果我们寻找价值10我想获得:

名1 | 3

name2 | 0

我带左右试图加入,但没有工作,我刚刚得到这个因为是匹配的唯一记录WHERE子句我猜:

名1 | 3

而不是名称2的结果。

我一直在寻找失败在这里把我的问题之前解决,希望有人能帮助我这个问题:)

对不起,我英文不好。 我真的很感激任何帮助,您可以提供

+0

表1中的id_user值与表2中的id列不匹配为什么name2的id_user是1而不是2? – 2013-02-25 23:35:42

+0

对不起,这是我的坏,只是修复它 – 2013-02-25 23:36:58

回答

0

不是最有效的查询但这应该工作

select user, (select count(*) from table1 b where b.id_user=a.id and b.value=10) 
from table2 a 

的时候,因为这个查询是如此低效,我将加入客户端上的结果,而不是试图在SQL中执行它。这个过程会像这样。

  1. SELECT * FROM从表1表2
  2. 选择id_user,COUNT(*)其中,值= 10
  3. 迭代通过查询#1和存储在一个对象中的结果可能看起来像
  4. 迭代通过查询#2并更新来自步骤#3的对象。

它总是依赖于结果集的大小和可能涉及的硬件,但通常情况下这样做速度更快,尽管在代码中编写起来要复杂得多。

+0

刚刚尝试过这种解决方案,它的工作原理,因为我想。谢谢!我也尝试在客户端进行连接 – 2013-02-26 00:47:05

0

试试这个。

SELECT t2.user,SUM(CASE WHEN t2.id=t1.id_user THEN 1 ELSE 0 END) AS TotalRecords 
FROM table2 t2 
LEFT JOIN table1 t1 ON t2.id =t1.id_user 
GROUP BY t2.id 
HAVING t1.value=10 
+0

尝试了这个,但给了我相同的结果,只是name1的记录,我的实际查询是这样的: SELECT t2.queue AS“Queue”,SUM(CASE WHEN t2。 id = t1.id_queue THEN 1 ELSE 0 END)AS TotalRecords FROM队列t2 LEFT JOIN调用t1 ON t2.id = t1.id_queue WHERE t1.datetime_end BETWEEN'2013-02-21 00:00:00'AND' 2013-02-21 23:59:59' GROUP BY t2.queue – 2013-02-26 00:15:22

+0

没有意识到你只需要那些值= 10。编辑。 – 2013-02-26 00:26:36

相关问题