Используйте LEFT OUTER JOIN, чтобы вернуть счетчик, даже если 0 - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь вернуть все указанные event_abr, даже если счетчик равен 0.

Вот мой SQL Запрос:

SELECT
    basketball_event_types.event_abr,
    count(*) value
FROM
    basketball_event_types
    LEFT OUTER JOIN basketball_game_events on basketball_event_types.id = basketball_game_events.event_type_id
    LEFT JOIN users on basketball_game_events.player_id = users.id
WHERE
    users.id = 198
AND
    basketball_game_events.game_id = 213
AND
    (basketball_event_types.event_abr = "TO" OR basketball_event_types.event_abr = "AST")
GROUP BY basketball_event_types.event_abr

Однако, когда я запускаю это, у указанного пользователя (198) 0 AST для указанной игры (213). Я хочу, чтобы AST -> 0 всплывал, но этого не происходит. Две важные вещи, которые я пробовал, - это добавление ВНЕШНЕГО из ЛЕВОГО СОЕДИНЕНИЯ, и я также пробовал использовать ifnull (count (*), 0). Ни один из них не дал мне результата, который я искал.

1 Ответ

2 голосов
/ 07 мая 2020

Фильтрация должна быть в предложении on. И вам нужно исправить count():

SELECT bet.event_abr, COUNT(u.id) as value
FROM basketball_event_types bet LEFT JOIN
     basketball_game_events bge
     ON bet.id = bge.event_type_id AND bge.game_id = 213 LEFT JOIN
     users u 
     ON bge.player_id = u.id AND u.id = 198
WHERE bet.event_abr IN ('TO', 'AST')
GROUP BY bet.event_abr;

Обратите внимание на изменения:

  • Фильтрация перенесена в предложения ON - оба фильтра в соответствующие предложения .
  • COUNT() подсчитывает значения в последней LEFT JOIN таблице.
  • Псевдонимы таблиц упрощают запись и чтение запроса.
  • IN проще, чем цепочка из OR условий.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...