2011-05-11 102 views
1
SELECT u.username, count(t.tid) as total 
FROM tbl2 t 
JOIN users u ON t.userid = u.userid 
GROUP BY t.userid 

上述查询工作正常,所有,它返回每个用户在tbl2表中至少有一个任务的总任务数。Mysql如何做这个查询

但是我想要做的是返回所有用户,即使用户在第二个tbl2表中没有任何与他相关的记录。我希望总数对于没有任何记录的用户显示为0,我该如何实现?

回答

4

给定其他答案的问题是,你要选择所有用户没有相关记录;使用LEFT JOIN,用户表位于连接的错误的(空)侧。你可以用右连接代替左连接,但是这种语法对我来说总感觉不太直观。

标准答案是扭转表的顺序,同时使用LEFT JOIN:

SELECT u.username, count(t.tid) as total 
FROM users u 
LEFT JOIN tbl2 t ON t.userid = u.userid 
GROUP BY u.username 

请注意,这是更好的做法(以及在某些的DBMS,要求)组在非聚集列在SELECT列表中,而不是在userid上分组并选择用户名。

+0

我想出了几分钟前,使用其他答案,它显示我0,但不是所有的用户,我扭转了查询,并开始分组u.userid而不是t.userid,它的工作(但一个问题,张贴它下面),我接受你的解决方案,因为它的完整解决方案和其他+1 +1谢谢:) – Zubair1 2011-05-11 16:22:25

+0

是t.userid聚合列(因为我认为总数是?) – Zubair1 2011-05-11 16:24:13

+1

聚合列是那些包含在诸如COUNT()之类的集合函数中。所以,不,userid不是你的查询中的聚合列 - 所以(或在这种情况下,用户名)是你分组的列。另请注意,由于't'中可能有空记录,因此应该按** u **。userid进行分组。否则,您可能仍会错过零计数用户。 – 2011-05-11 16:25:58

0

你想使用一个LEFT JOIN然后代替

SELECT u.username, count(t.tid) as total 
FROM tbl2 t 
LEFT JOIN users u ON t.userid = u.userid 
GROUP BY t.userid 

LEFT JOIN将加入该表并显示tbl2的空列的结果,如果相关的条目不存在。

1

您应该使用LEFT JOIN的内蒙古insteed JOIN这样的(加入的默认类型),东西:

SELECT u.username, count(t.tid) as total 
FROM tbl2 t 
LEFT JOIN users u ON t.userid = u.userid 
GROUP BY t.userid 
+0

+1谢谢不知道JOIN()= INNER JOIN()默认情况下。 – Zubair1 2011-05-11 16:25:30