使用group by和COUNT正确使用HAVING

时间:2010-12-02 13:32:04

标签: sql mysql

我正在运行此查询:

SELECT u.id as id, 
       COUNT(DISTINCT YEAR(TIMESTAMP), WEEK(TIMESTAMP)) cc, 
       GROUP_CONCAT(DISTINCT YEAR(TIMESTAMP),'-',WEEK(TIMESTAMP)) a
FROM   users u 
       JOIN checkins c 
         ON c.userid = u.id 
GROUP  BY userid
HAVING COUNT(cc) = 3

这会产生以下结果:

id  cc  a
05  3   2010-43,2010-47,2010-45 
06  2   2010-44,2010-45 
13  3   2010-43,2010-45,2010-48 
20  3   2010-45,2010-43,2010-47 
21  3   2010-43,2010-47,2010-45 
22  2   2010-47,2010-48 
25  3   2010-48,2010-43,2010-46 
27  2   2010-42,2010-47 
30  2   2010-48,2010-45 
41  3   2010-44,2010-45,2010-47 
44  2   2010-42,2010-44 
50  2   2010-44,2010-47 
52  2   2010-48,2010-47 
57  2   2010-43,2010-44 
71  3   2010-43,2010-48,2010-47 
72  2   2010-43,2010-44 
78  3   2010-47,2010-42,2010-43 
79  2   2010-45,2010-46 
80  2   2010-46,2010-44 
87  1   2010-46 
97  1   2010-48 
108 3   2010-43,2010-47,2010-45 

如您所见,cc列的值为2,3或甚至为1。

当我告诉HAVING应该是3时,怎么回事?

2 个答案:

答案 0 :(得分:2)

MySQL确实允许在Having子句中使用别名。你需要使用:

HAVING cc = 3

不是

HAVING COUNT(cc) = 3

为了过滤结果,只包含cc值为3的行。我实际上很不确定HAVING COUNT(cc) = 3为什么会返回任何结果。

答案 1 :(得分:1)

如前所述关于别名和有条款,我只想扩展它。

您已经创建了cc别名,其中包含您要过滤的计数,因此您只需要在HAVING中引用别名列,例如:

HAVING cc = 3

如果您要按cc列分组(如果可能的话),那么您尝试过的(COUNT(cc) = 3)会有意义,然后这将过滤掉所有具有相同cc值但未准确显示的行3次。