我有以下表格:
类(class)
+----------+-------------------------+
| course_id | course_name |
+-----------+------------------------+
| 1 | s001 |
| 2 | s002 |
| 3 | s003 |
| 4 | s004 |
+-----------+------------------------+
COURSE_PREREQUISITES
+----------+-------------------------+
| course_id | prerequisite_course_id |
+-----------+------------------------+
| 3 | 2 |
+-----------+------------------------+
| 4 | 1 |
+-----------+------------------------+
| 4 | 2 |
+-----------+------------------------+
| 4 | 3 |
+-----------+------------------------+
我的问题是:给定一个学生已完成的类(class) ID 列表,我如何才能获得该学生有资格参加的类(class)列表?
示例
如果学生已完成 course_id
2,查询应返回类(class):1,(因为它没有先决条件)和 3 但不是 4,因为 4 也有 1,3 作为先决条件。
尝试解决方案
我试过像这样为完成类(class) 2 的学生使用 IN
语句:
SELECT DISTINCT course_id FROM COURSE_PREREQUISITES
WHERE prerequisite_course_id IN (2)
但它显然失败了,因为它返回了满足至少一个先决条件的所有类(class),这不是我需要的。
我遇到了这个类似的问题: Select rows that match all items in a list .但是提供的解决方案对我来说不起作用,因为类(class)的先决条件数量不固定。
最后,我还想知道 NOSQL 数据库(couchDB、mongoDB)是否更适合解决此类问题。
最佳答案
accept cid;
select a.course_id from
(select course_id, max(prerequisite_course_id) as prerequisite_course_id from course_prerequisites
group by course_id
having count(*)=1) a
where a.prerequisite_course_id=&cid
union
select b.course_id from
(select course_id from course where course_id!=&cid) b
left join course_prerequisites c
on b.course_id=c.course_id where c.course_id is null;
并集之前的前半部分是获取以提供的输入为先决条件的类(class)的 course_id,并集之后的另一半是选择没有任何先决条件的类(class)。
这适用于甲骨文。接受是在运行时获取输入。对于其他数据库,您可以忽略接受语句并传入 course_id 代替 &cid。
关于mysql - SQL 查询以选择满足先决条件要求的主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54615390/