说我下面有一个表结构。现在,一名拥有先修课程1,2,3的学生来了,想知道他可以学什么课程。数据库应返回课程A& B给他。
我正在使用mySQL,在这种情况下我可以使用哪种SQL查询?
假设每门课程的先决条件数有所不同,学生拥有的先决条件存储在PHP的数组中。
+-----------+-----------------+
| course_id | prerequisite_id |
+-----------+-----------------+
| A | 1 |
| A | 2 |
| A | 3 |
| B | 2 |
| B | 3 |
| C | 4 |
| D | 2 |
| D | 3 |
| D | 4 |
+-----------+-----------------+
答案 0 :(得分:4)
这应该有效:
select
course_id
from
courses
where
course_id not in (
select
course_id
from
courses
where
prerequisite_id not in (1,2,3)
)
编辑:刚开始上课。
SELECT
course_id
FROM
courses
WHERE
course_id NOT IN (
SELECT
course_id
FROM
courses
WHERE
prerequisite_id NOT IN (1,2,3)
)
GROUP BY course_id;
答案 1 :(得分:1)
我会为此使用having
子句:
SELECT course_id
FROM table t
GROUP BY course_id
HAVING SUM(case when prerequisite_id not in (1, 2, 3) then 1 else 0 end) = 0;
having
子句计算学生未达到的先决条件数。
如果要排除至少有一个作为先决条件的课程:
SELECT course_id
FROM table t
GROUP BY course_id
HAVING SUM(case when prerequisite_id not in (1, 2, 3) then 1 else 0 end) = 0 and
SUM(case when prerequisite_id in (1, 2, 3) then 1 else 0 end) > 0;