mysql - SQL 查询以选择满足先决条件要求的主题

标签 mysql sql

我有以下表格:

类(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/

相关文章:

mysql - Doctrine2 - 哪种方法更合适?

mysql - 通过查找另一个表来替换 csv 值

mysql - 安装sqoop,给bin/sqoop-list-databases : line 26:/Users/apple/sqoop: is a directory

sql - 如何检查空表并终止存储过程

mysql - MySQL CASE 语句中的相关子查询

mysql - 如何在vb.net中备份mysql数据库

MySQL统计输出

mysql - 处理具有数百万条记录更新和大量读取的 MySQL 表的最佳方法

mysql - 'modules.modules_id' 中的未知列 'on clause'

sql - Oracle 语句计数不正确