我正在运行此查询:
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时,怎么回事?
答案 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次。