Спасибо всем за вклад, особенно в последние часы щедрости, это было невероятно полезно.
Это дополнительный вопрос к Выбрать курсы, которые полностью удовлетворяют заданному списку предварительных условий, и дополнительно пояснить ситуацию. Определенно рекомендуется прочитать, чтобы лучше понять этот вопрос. (Курсы и предметы — разные сущности, предметы являются только предпосылками для курсов и не обязательно должны быть предпосылками для других предметов — представьте, что школьные предметы ведут к возможным университетским курсам)
У меня есть моя база данных, выложенная как таковая.
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 Course.id, course.Name, GROUP_CONCAT(DISTINCT Prerequisite.Name) AS 'Prerequisite Name(s)'
FROM Course
LEFT JOIN CoursePrerequisites ON Course.id = CoursePrerequisites.Course_FK
LEFT JOIN Prerequisite ON Prerequisite.id = CoursePrerequisites.Prerequisite_FK
WHERE NOT EXISTS
(SELECT 1
FROM CoursePrerequisites
WHERE Course.id = CoursePrerequisites.Course_FK
AND CoursePrerequisites.Prerequisite_FK NOT IN (SELECT Prerequisite.id FROM Prerequisite Where Name = 'Art' OR Name = 'English' OR Name = 'Psychology''))
GROUP BY Course.id;
Что хорошо работает, чтобы выбрать курсы, которые точно заполнены их предпосылками.
Однако я столкнулся с препятствием, пытаясь организовать базу данных таким образом, чтобы она могла представлять курсы с составными пререквизитами. Например, курс может потребовать изучения английского языка, математики и либо искусства, либо психологии. Другим примером может быть обязательный английский язык и два предмета по физике, психологии, искусству и т. д.
Что было бы подходящим способом структурировать базу данных для обработки этих типов предварительных условий (я пытался выполнить поиск, но ничего не нашел (изменить: нашел это, но бесполезно: Моделирование курсов и предварительных требований в базе данных) и как мне изменить приведенный выше запрос, чтобы он снова возвращал только курсы, для которых выполнены хотя бы предварительные условия?
Для уточнения: учитывая список предметов (из таблицы Prerequisites), я хочу вернуть список курсов, которые будут подходить для этих предметов. В текущей схеме базы данных, учитывая математику, английский язык, искусство и физику, возвращенными курсами должны быть Курс 1 и Курс 5 (а НЕ Курс 2 — у него есть предварительные условия Искусство и Психология, последний из которых не удовлетворяет данным входным данным), как это предусмотрено соединительный стол. Я хочу расширить сложность предварительных условий курса от простого «И» (Курс 1 требует математики И английского языка) до чего-то, что может обрабатывать «ИЛИ» / один из x из набора y (например, для курса 1 теперь требуется английский язык, математика И один или больше по искусству или психологии).
Прогресс Редактировать:
Я думал о расширении соединительной таблицы несколькими дополнительными столбцами для «по крайней мере одного из следующих» и «по крайней мере двух из» и т. д., а также еще одного столбца для «всех» и размещения предварительных условий в структуре туда. Является ли это разумным способом сделать это и каким будет эффективный запрос в MySQL для поиска подходящих курсов с учетом списка предметов?
Прогресс:
Куба Выростек предложил ниже перечислить все комбинации предварительных условий для каждого курса в отдельные наборы. Хотя это сработает, мне нужно сделать это для ~ 6 тыс. строк, каждая со многими перечислениями. Есть ли более эффективный способ сделать это?