在 mysql 中查找参加每门课程的学生的 ID

Find the id of students who take every course, in mysql

我有 3 个 table:

Student (Id, Name, Country) 
Course (CrsCode, CrsName, Type, Instructor) 
Results(Id, CrsCode, Grade)

我必须使用 SQL 查询来解决以下问题。 Id 和 CrsCode 是每个 table 中的关键字段。类型字段指定课程类型,例如MATH、STAT、SYSC、TTMG、ELEC 等

  1. 查找参加 TTMG 或 SYSC 课程的学生的 ID。
  2. 找到参加每门课程的学生的 ID。
  3. 查找参加每门 TTMG 课程或每门 SYSC 课程的学生的 ID。

下面是第 3 部分的示例数据。第 1 张图片是课程 Table,第 2 张图片是结果 table

我可以使用以下 SQL 查询解决第一个问题:

SELECT R.ID FROM RESULTS R JOIN COURSE C ON C.CRSCODE = R.CRSCODE WHERE C.TYPE="TTMG" OR C.TYPE ='SYSC

对于第二个问题,我想我们又得联系一下2nd (Course) and 3rd (Results) table in order to get the result。这里不得不说一个具体的案例。 We have to consider a case that there is one specific student who is taking all courses(CrsCode) and we have to find the id of that student

我相信查询仍然与问题 1 相同,但这次会有一些小的变化:

SELECT R.ID FROM RESULTS R JOIN COURSE C 

我没有在课程 C 之后包括任何内容,因为我不确定之后的答案。任何指针将不胜感激。

Find the Id of students who take every course.

假设课程 table 包含学生可以选修的所有课程,您可以 group by results table 中的 id 列并检查计数是否相等到 course table 中的行数。

SELECT ID
FROM RESULTS
GROUP BY ID
HAVING COUNT(DISTINCT CRSCODE) = (SELECT COUNT(*) FROM COURSE)

编辑:根据 OP 的评论

Find the id of students who take every TTMG or SYSC course

SELECT r.id
FROM  course c
JOIN RESULTS r on c.CRSCODE=r.CRSCODE
GROUP BY r.ID 
HAVING COUNT(case when type = 'SYSC' then r.CRSCODE end)  = (SELECT COUNT(*) FROM COURSE WHERE type = 'SYSC')
OR COUNT(case when type = 'TTMG' then r.CRSCODE end) = (SELECT COUNT(*) FROM COURSE WHERE type = 'TTMG')

Sample Demo