Невозможно исключить записи, которые не присоединяются - PullRequest
0 голосов
/ 08 апреля 2019

Мне нужно вернуть только те соревнования, которые имеют рейтинг, этот рейтинг находится внутри таблицы league_ranking, и каждое соревнование связано с колонкой round_id.

По сути, запрос должен возвращать все соревнования определенной страны, при условии, что все соревнования этой страны должны иметь рейтинг, поэтому я сделал:

SELECT c.name AS competition_name,
  c.id AS competition_id
  FROM competition c
  JOIN competition_seasons s ON s.competition_id = c.id
  JOIN competition_rounds r ON r.season_id = s.id
  LEFT JOIN league_ranking l ON l.round_id = r.id
  WHERE c.country_id = :country_id AND l.round_id IS NULL
  GROUP BY c.id
  ORDER BY c.name ASC

Этот запрос также возвращает конкуренцию, которая не имеет рейтинга, например:

Конкурс

id | country_id | name
202     12         Cup

competition_seasons

id  | competition_id | name
955       202           2018/2019

competition_rounds

id    | season_id |
 2122    955

league_ranking

нет записей за этот раунд

Запрос выше также вернет соревнование 202, что я сделал не так?

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Ваш запрос в его нынешнем виде специально предназначен для возврата только соревнований с нет рейтинга лиги, поскольку он использует LEFT JOIN до league_ranking, а затем проверяет, что l.round_id IS NULL, что будет только верно когда соревнование не имеет рейтинга в лиге (то есть нет соответствующей строки с l.round_id = r.id). Если вы хотите только соревнования, которые имеют рейтинг лиги, измените LEFT JOIN на JOIN и удалите условие l.round_id IS NULL. Обратите внимание, что вам не нужно предложение GROUP BY, и я удалил его.

SELECT c.name AS competition_name,
  c.id AS competition_id
  FROM competition c
  JOIN competition_seasons s ON s.competition_id = c.id
  JOIN competition_rounds r ON r.season_id = s.id
  JOIN league_ranking l ON l.round_id = r.id
  WHERE c.country_id = :country_id
  ORDER BY c.name ASC

Демонстрация на dbfiddle

0 голосов
/ 08 апреля 2019

Пожалуйста, попробуйте этот запрос

SELECT c.name AS competition_name, c.id AS competition_id FROM competition c JOIN competition_seasons s ON s.competition_id = c.id JOIN competition_rounds r ON r.season_id = s.id JOIN league_ranking l ON l.round_id = r.id WHERE c.country_id = :country_id GROUP BY c.id ORDER BY c.name ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...