SQL GROUP BY / COUNT, даже если нет результатов - PullRequest
2 голосов
/ 23 декабря 2008

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

SELECT g.*, count(*) 
FROM games g, tickets t 
WHERE (t.game_number = g.game_number
   OR NOT EXISTS (SELECT * FROM tickets t2 WHERE t2.game_number=g.game_number))
GROUP BY t.game_number;

Что я делаю не так?

Ответы [ 3 ]

5 голосов
/ 23 декабря 2008

Вам нужно сделать левое соединение:

SELECT g.Game_Number, g.PutColumnsHere, count(t.Game_Number) 
FROM games g
LEFT JOIN tickets t ON g.Game_Number = t.Game_Number
GROUP BY g.Game_Number, g.PutColumnsHere

В качестве альтернативы, я думаю, что это немного яснее с коррелированным подзапросом:

SELECT g.Game_Number, G.PutColumnsHere,
  (SELECT COUNT(*) FROM Tickets T WHERE t.Game_Number = g.Game_Number) Tickets_Count
FROM Games g

Просто убедитесь, что вы проверили план запроса, чтобы убедиться, что оптимизатор хорошо его интерпретирует.

2 голосов
/ 23 декабря 2008

Вам нужно больше узнать о том, как использовать соединения в SQL:

SELECT g.*, count(*) 
FROM games g
 LEFT OUTER JOIN tickets t 
 USING (game_number)
GROUP BY g.game_number;

Обратите внимание, что в отличие от некоторых брендов баз данных, MySQL позволяет вам перечислить много столбцов в списке выбора, даже если вы только GROUP BY их первичный ключ. Пока столбцы в вашем списке выбора функционально зависят от столбца GROUP BY, результат будет однозначным.

База данных других марок (Microsoft, Firebird и т. Д.) Выдает ошибку, если вы перечисляете какие-либо столбцы в списке выбора, не включая их в GROUP BY или в функцию агрегирования.

1 голос
/ 23 декабря 2008

"FROM games g, tickets t" - это проблемная строка. Это выполняет внутреннее соединение. Любое, где пункт не может добавить к этому. Я думаю, что вы хотите LEFT OUTER JOIN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...