我正在尝试编写一个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很新,所以如果我的表格布局有问题,或者这是一个看似简单的问题,请原谅.我一直在尽我所能地搜索,但只能找到解决这个问题的反面的解决方案.
看来我需要对集合做一些区别:
>构建一组具有先决条件的课程(针对每个先决条件?)
>构建一组没有先决条件的课程
>执行集合操作的差异:选择第一组中的全部存在而不存在第二组
看起来很简单,但我现在对联结表以及如何在许多先决条件中处理这个问题感到困惑.
我希望返回至少完全满足给定先决条件列表的行,而不是包含至少一个先决条件的行.
例如,如果给出先决条件“艺术”,“英语”,“心理学”,则应返回的唯一行是Course2(先决条件超过满足).
谢谢