Я пытаюсь написать SQL-запрос, который вернет список курсов, на которые человек имеет право, учитывая список его завершенных предметов (для использования в качестве предварительных условий).
У меня есть моя база данных, выложенная как таковая.
Prerequisite:
+---------------+---------------+
| Id | Name | (Junction table)
|---------------|---------------| CoursePrerequisites:
| 1 | Maths | +---------------+---------------+
| 2 | English | | Course_FK | Prerequisite_FK
| 3 | Art | |---------------|---------------|
| 4 | Physics | | 1 | 1 |
| 5 | Psychology | | 1 | 2 |
+-------------------------------+ | 2 | 3 |
| 2 | 5 |
Course: | 5 | 4 |
+---------------+---------------+ +---------------v---------------+
| Id | Name |
|---------------|---------------|
| 1 | Course1 |
| 2 | Course2 |
| 3 | Course3 |
| 4 | Course4 |
| 5 | Course5 |
+---------------v---------------+
Я экспериментировал с запросом, который выглядит так:
SELECT DISTINCT C.*
FROM Course C
INNER JOIN JNCT_Course_Prerequisites cp
ON C.Id = cp.Course_FK
WHERE cp.Prerequisite_FK IN (SELECT Prerequisites.Id FROM Prerequisites Where Name = 'Art' AND Name = etc etc)
Однако это возвращает любой курс, где искусство является обязательным условием, а не только курсы, которые полностью удовлетворяют заданному списку предварительных требований. Например. Он вернет курс 2, учитывая только искусство в качестве предварительного условия для студента, хотя курс также требует психологии.
Я очень новичок в SQL, поэтому, пожалуйста, извините меня, если есть проблема с моей структурой таблицы и т. д., или если это, казалось бы, простой вопрос. Я искал все, что мог, но могу найти только то, что кажется решением, обратным этой проблеме.
Кажется, мне нужно сделать разницу наборов:
- Создайте набор курсов, которые имеют предварительные условия (для каждого предварительного условия?)
- Создайте набор курсов, которые не имеют предварительных условий
- Выполните операцию с разницей наборов: выберите все, что присутствует в первом наборе, и не присутствует во втором. Кажется, это просто, но теперь я запутался с соединительной таблицей и тем, как справиться с этим во многих предварительных условиях.
Я хочу возвращать строки, которые по крайней мере полностью удовлетворяют списку заданных предварительных условий, а не строки, содержащие хотя бы одно из предварительных требований.
Например, если заданы предварительные условия «Искусство», «Английский язык», «Психология», то единственная строка, которая должна быть возвращена, — это строка для курса 2 (предварительные требования более чем выполнены).
Спасибо
course
безprerequisite
(ведь предварительные условия — это тоже курсы, верно?). Вы сохраняете текущую таблицу перекрестных ссылок в основном как есть, просто переключаетесь туда, куда указывает другой внешний ключ. - person Clockwork-Muse   schedule 01.01.2014