Используя правильно HAVING с group by и COUNT

0

Я выполняю этот запрос:

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 ответа

2
Лучший ответ

MySQL разрешает псевдонимы в предложении Have. Вам нужно будет использовать:

HAVING cc = 3

not

HAVING COUNT(cc) = 3

чтобы отфильтровать результаты, чтобы включать только строки, которые имеют значение cc 3. Я действительно не уверен, но почему HAVING COUNT(cc) = 3 вернет любые результаты.

1

Как ранее говорилось об псевдонимах и фразе, я просто хотел бы расширить его.

Вы уже создали псевдоним cc, который содержит подсчеты, которые вы хотите отфильтровать, поэтому вам просто нужно ссылаться на столбцы с псевдонимом в HAVING, например:

HAVING cc = 3

То, что вы пробовали (COUNT(cc) = 3), имело бы смысл, если бы вам пришлось группировать столбец cc (если это было возможно), а затем это было бы отфильтровывать все строки с одинаковым значением cc, которые не отображались ровно 3 раза.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню