Невозможно исключить записи, которые не ПРИСОЕДИНЯЮТСЯ

Мне нужно вернуть только те соревнования, у которых есть рейтинг, этот рейтинг находится внутри таблицы 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 на JOIN?

Amir Molaei 08.04.2019 10:30

@рад то же самое

sfarzoso 08.04.2019 10:37
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
2
41
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваш запрос в его нынешнем виде специально предназначен для возврата только соревнований с рейтингом лиги нет, потому что он использует от 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

Я уже пробовал это, и соревнование 202 всегда возвращается, но у него нет рейтинга лиги.

sfarzoso 08.04.2019 10:38

@sfarzoso это невозможно, если в таблице рейтинга лиги нет записей. Ты изменил LEFT JOIN на JOIN?

Nick 08.04.2019 10:40

Хорошо, я нашел проблему, есть несколько раундов конкурса 202, в которых есть рейтинги.. поэтому не сработало.

sfarzoso 08.04.2019 10:46

@sfarzoso приятно слышать. Я только что закончил создавать демонстрационную версию, показывающую, что это работает... db-fiddle.com/f/adcpqXaFm6sNrJwXJXfw5D/0

Nick 08.04.2019 10:47

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

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

Другие вопросы по теме