Почему этот агрегатный запрос возвращает на одну строку меньше, чем следует? - PullRequest
1 голос
/ 21 ноября 2010

У меня есть классическая проблема «получить все строки в одной таблице с количеством соответствующих строк в другой таблице», которая должна быть решена с помощью этого запроса:

SELECT
    ideas.id,
    ideas.idea,
    submitted,
    COUNT(votes.id) AS vote_count
FROM ideas
LEFT OUTER JOIN votes ON ideas.id = votes.idea
WHERE dead = 0
GROUP BY votes.idea
ORDER BY vote_count DESC, submitted DESC
LIMIT 10;

Есть 4 строки (с мертвыми = 0) в идеях и одна строка в голосах (относительно первой идеи). Однако, этот запрос возвращает две записи (идея № 1 и идея № 2) с правильными voice_counts. Почему это не возвращает все записи в идеях?

Ответы [ 2 ]

3 голосов
/ 21 ноября 2010

Когда вы говорите GROUP BY votes.idea, вы запрашиваете одну строку результата на значение идеи в голосах. Поскольку вы говорите, что голосование имеет только одну строку, вы должны ожидать только две записи в результате - одну, соответствующую значению идеи в этой строке голосов, а другую с NULL (уплотнение трех строк без соответствующей записи голосования). *

Вы имели в виду GROUP BY ideas.idea?

1 голос
/ 21 ноября 2010

Изменение:

GROUP BY votes.idea

до:

GROUP BY ideas.id

Потому что votes.idea может быть NULL.

...