在mysql中找到学习每门课程的学生的ID

时间:2017-01-08 00:06:07

标签: mysql sql relational-division

我有3张桌子:

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

我必须使用SQL查询在q下面解决。 Id和CrsCode是每个表中的关键字段。 “类型”字段指定课程类型,例如MATH,STAT,SYSC,TTMG,ELEC等。

  1. 查找参加TTMG或SYSC课程的学生的身份。
  2. 查找参加每门课程的学生的ID。
  3. 查找参加每个TTMG课程或每个SYSC课程的学生的ID。
  4. 以下是第3部分的样本数据。第1张图片是课程表,第2张图片是结果表

    enter image description here

    enter image description here

    我可以使用以下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之后我没有包含任何内容,因为我之后不确定答案。任何指针都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

  

查找参加每门课程的学生的ID。

假设课程表包含学生可以学习的所有课程,您可以group by results表中的id列,检查计数是否等于course中的行数表。

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

编辑:基于OP的评论

  

查找参加每个TTMG或SYSC课程的学生的身份

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