我对MySQL很新,并试图理解多对多关系,因为这些例子可以在访谈中弹出
有3张桌子,因为学生可以有很多课程,而课程可以有很多学生,这是多对多关系吗?
表格是 学生 - 有学生证,姓名,出生日期和部门。 课程 - 有ID,当然是名字 Student_Courses-有student_id,course_id
我如何显示这两个问题 -
1)给定学生ID,返回学生所选课程的所有名称 2)返回正在修读X课程或以上课程的学生的姓名(例如4门以上)。
我试图在这些上写查询,但我被卡住了......
答案 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
;