Как сделать выборку в 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 не существует.
Для правильного вопроса надо знать половину ответа
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