Мне нужно вернуть только те соревнования, у которых есть рейтинг, этот рейтинг находится внутри таблицы 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
соревнования_сезоны
id | competition_id | name
955 202 2018/2019
соревнования_раунды
id | season_id |
2122 955
лига_рейтинг
нет рекорда в этом раунде
Запрос выше также вернет конкуренцию 202
, что я сделал не так?
@рад то же самое
Ваш запрос в его нынешнем виде специально предназначен для возврата только соревнований с рейтингом лиги нет, потому что он использует от 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
Я уже пробовал это, и соревнование 202 всегда возвращается, но у него нет рейтинга лиги.
@sfarzoso это невозможно, если в таблице рейтинга лиги нет записей. Ты изменил LEFT JOIN
на JOIN
?
Хорошо, я нашел проблему, есть несколько раундов конкурса 202, в которых есть рейтинги.. поэтому не сработало.
@sfarzoso приятно слышать. Я только что закончил создавать демонстрационную версию, показывающую, что это работает... db-fiddle.com/f/adcpqXaFm6sNrJwXJXfw5D/0
Пожалуйста, попробуйте этот запрос
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
Что если заменить
LEFT JOIN
наJOIN
?