Как правильно использовать COUNT () в MySQL? - PullRequest
1 голос
/ 29 марта 2011

Я пытаюсь получить список идентификаторов пользователей (uid), которые опубликовали более 3 статей.Вот мой sql:

SELECT n.uid
FROM node
GROUP BY n.uid
HAVING COUNT( n.type = 'article' ) > 3

После прочтения, я предполагаю, что моя ошибка в том, что я использовал COUNT, но я не могу понять, что я делаю неправильно.Есть намеки?Спасибо, куча!

Ответы [ 5 ]

6 голосов
/ 29 марта 2011

Больше похоже на ...

SELECT uid
FROM node
WHERE type = 'article'
GROUP BY uid
HAVING COUNT(uid) > 3

РЕДАКТИРОВАТЬ : Я добавлю немного больше информации о WHERE против HAVING. Насколько я помню, HAVING используется для применения условий постагрегации к GROUP BY. WHERE используется для применения условий к таблице в целом.

3 голосов
/ 29 марта 2011
HAVING COUNT( n.type = 'article' ) > 3

Почему это не работает (re: я не могу понять, что я делаю неправильно) :

  • n.type = 'article' << это возвращает BOOLEAN, который имеет значение true / false или 1/0 </li>
  • COUNT (x) увеличивает счетчик всякий раз, когда x НЕ равен NULL
  • оба из 1/0 не равны нулю, поэтому он считает ВСЕ типы и эквивалентен COUNT (*)

Вы хотели (этот ответ уже был дан, но повторяется здесь)

SELECT n.uid
FROM node
WHERE n.type = 'article'
GROUP BY n.uid
HAVING COUNT( * ) > 3

В общем, вы также можете правильно написать COUNT, используя CASE, но фильтр WHERE обычно быстрее

SELECT n.uid
FROM node
GROUP BY n.uid
HAVING COUNT( CASE WHEN n.type = 'article' THEN 1 END ) > 3
1 голос
/ 29 марта 2011

COUNT () может только подсчитывать сгруппированные записи или столбцы в сгруппированных результатах; его нельзя использовать для подсчета записей, которые соответствуют условию, как вы хотите. Попробуйте либо подзапросить выражение, либо перетащить его в список выбора, где его можно использовать в условиях:

SELECT n.uid, COUNT(*)
FROM node n
WHERE n.type = 'article'
GROUP BY n.uid
HAVING COUNT(*) > 3

SELECT n.uid
FROM node n
WHERE (SELECT COUNT(*) from node n2 where n2.uid = n.uid AND n.type == 'article')  > 3
0 голосов
/ 29 марта 2011
SELECT n.uid
FROM node n
--- keep only articles postings
WHERE n.type = 'article'
--- group by user
GROUP BY n.uid
--- count rows while grouping (you can use COUNT(*) instead, result is same)
HAVING COUNT( n.uid ) > 3

Поскольку TRUE = 1 и FALSE = 0 в MySQL (как объяснил Ричард), ваш запрос будет работать (!), Если изменить только COUNT на SUM:

SELECT n.uid
FROM node n
GROUP BY n.uid
HAVING SUM( n.type = 'article' ) > 3

Ноэто не правильный способ сделать это!

0 голосов
/ 29 марта 2011
SELECT n.id, COUNT(n.id) as my_count
FROM node
WHERE n.type = 'article'
GROUP BY n.id
HAVING my_count > 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...