SQL检查多行的条件

时间:2014-01-19 14:56:48

标签: mysql

说我下面有一个表结构。现在,一名拥有先修课程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               |
+-----------+-----------------+

2 个答案:

答案 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;