Я выполняю этот запрос:
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?
MySQL разрешает псевдонимы в предложении Have. Вам нужно будет использовать:
HAVING cc = 3
not
HAVING COUNT(cc) = 3
чтобы отфильтровать результаты, чтобы включать только строки, которые имеют значение cc
3. Я действительно не уверен, но почему HAVING COUNT(cc) = 3
вернет любые результаты.
Как ранее говорилось об псевдонимах и фразе, я просто хотел бы расширить его.
Вы уже создали псевдоним cc
, который содержит подсчеты, которые вы хотите отфильтровать, поэтому вам просто нужно ссылаться на столбцы с псевдонимом в HAVING, например:
HAVING cc = 3
То, что вы пробовали (COUNT(cc) = 3
), имело бы смысл, если бы вам пришлось группировать столбец cc (если это было возможно), а затем это было бы отфильтровывать все строки с одинаковым значением cc, которые не отображались ровно 3 раза.