返回学生正在学习的所有课程(多对多SQL数据库示例)

时间:2018-04-04 17:00:19

标签: sql mysqli many-to-many

我对MySQL很新,并试图理解多对多关系,因为这些例子可以在访谈中弹出

有3张桌子,因为学生可以有很多课程,而课程可以有很多学生,这是多对多关系吗?

表格是 学生 - 有学生证,姓名,出生日期和部门。 课程 - 有ID,当然是名字 Student_Courses-有student_id,course_id

我如何显示这两个问题 -

1)给定学生ID,返回学生所选课程的所有名称 2)返回正在修读X课程或以上课程的学生的姓名(例如4门以上)。

我试图在这些上写查询,但我被卡住了......

1 个答案:

答案 0 :(得分:3)

如果选择给定学生证的所有课程,您可以尝试以下操作,这将为学生所关联的每门课程返回一行。

select
  s.name as StudentName,
  c.name as CourseName
from `Student` as s
  inner join `Student_Course` as sc on (sc.student_id = s.ID)
  inner join `Course` as c on (c.ID = sc.course_id)
where
  (s.`ID` = 'given_Student_ID_here')
;

至于选择参加N门或更多门课程的学生名单,你可以使用聚合子选择作为WHERE子句,我们引用其中一个外部表(即[学生]),这样聚合的结果是按Student记录个性化的:

select
  s.name as StudentName
from `Student` as s
where
  (
    (
      select count(*)
      from `Student_Course` as sc
        inner join `Course` as c on (c.ID = sc.course_id)
      where (sc.student_id = s.ID)
    ) >= 4
  )
;

您可以通过使用GROUP BY和HAVING子句考虑另一种解决第二个问题的方法:

select
  s.name as StudentName
from `Student` as s
  inner join `Student_Course` as sc on (sc.student_id = s.ID)
  inner join `Course` as c on (c.ID = sc.course_id)
group by
  s.name
having
  count(*) >= 4
;