ap0stal
@ap0stal
Web-разработчик

Как сделать выборку в MySQL по несуществующему отношению?

Есть таблица student [id, name, surname] которая содержит информацию о студентах учебного заведения.
Есть таблица contract [id, student_id], которая содержит информацию о контрактах студента.
Есть таблица contract_discipline [contract_id, discipline_id], которая содержит информацию о выбранных студентом дисциплинах в рамках договора.
Есть таблица discipline [id, title], которая содержит информацию о преподаваемых дисциплинах в учебном заведении.

Задача

Выбрать студентов, в контрактах которых отсутствует заданная дисциплина, например, её id = 5, то есть contract студента, где в отношении contract_discipline.discipline_id = 5 не существует.
  • Вопрос задан
  • 118 просмотров
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT `s`.`id`, ...
  FROM `student` AS `s`
  LEFT JOIN (
    SELECT DISTINCT `c`.`student_id` AS `student_id`
      FROM `contract` AS `c`
      JOIN `contract_discipline` AS `cd`
        ON `cd`.`contract_id` = `c`.`id` AND `cd`.`discipline_id` = :discipline_id
  ) AS `c` ON `c`.`student_id` = `s`.`id`
  WHERE `c`.`student_id` IS NULL
Ответ написан
Комментировать
petermzg
@petermzg
Самый лучший программист
Подзапросом
... t where not exists(select 1 from contract_discipline
                                  where contract_id = t.contract_id and discipline_id = 5)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
https://technet.microsoft.com/ru-ru/library/ms1890...
Поясню если не очень понятно - в вашем случае надо выбрать всех с дисциплиной 5 и исключить их из выборки
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы