我正在尝试编写一个 SQL 查询,该查询将返回一个人有资格参加的类(class)列表,给定他们已完成的科目列表(用作先决条件)。
我的数据库是这样布局的。
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)
然而,这会返回任何以艺术为先决条件的类(class),而不仅仅是完全满足给定先决条件列表的类(class)。例如。它将返回类(class) 2,仅将艺术作为学生的先决条件,即使该类(class)还需要心理学。
我是 SQL 的新手,所以如果我的表布局等方面有问题,或者这是一个看似简单的问题,请原谅。我一直在尽我所能地四处寻找,但只能找到似乎是这个问题的反面的解决方案。
看来我需要做一组差异:
- 构建一组具有先决条件的类(class)(针对每个先决条件?)
- 构建一组没有先决条件的类(class)
- 执行不同的集合操作:选择第一个集合中所有存在的和第二个集合中不存在的所有集合 看起来很简单,但我现在对联结表以及如何在许多先决条件下处理它感到困惑。
我希望返回至少完全满足给定先决条件列表的行,而不是包含至少一个先决条件的行。
例如,如果给出了先决条件“艺术”、“英语”、“心理学”,那么应该返回的唯一行是类(class) 2(先决条件远远满足)。
谢谢
最佳答案
SELECT * FROM Course C LEFT JOIN Course_Prerequisites cp ON C.Id = cp.Course_FK
WHERE Prerequisite_FK IN (SELECT Prerequisites.Id FROM Prerequisites Where Name = 'Art' OR Name = etc etc)
NOT EXISTS
(SELECT * FROM Course C LEFT JOIN Course_Prerequisites cp ON C.Id = cp.Course_FK
WHERE Prerequisite_FK NOT IN (SELECT Prerequisites.Id FROM Prerequisites Where Name = 'Art' OR Name = etc etc))
关于mysql - 选择由给定的先决条件列表完全满足的类(class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20671624/