【问题标题】:Return all courses a student is taking (Many to Many SQL Database example)返回学生正在学习的所有课程(多对多 SQL 数据库示例)
【发布时间】:2018-09-14 08:14:03
【问题描述】:

我对 MySQL 还很陌生,并试图理解多对多关系,因为这些示例可能会在面试中弹出

有3个表,一个Student可以有很多门课程,一个Course可以有很多学生,这就是Many-to-Many关系吧?

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

我将如何显示这两个问题-

1) 给定一个学生 ID,返回学生正在学习的所有课程名称 2) 返回正在修读 X 门或更多课程(例如 4 门或更多课程)的学生姓名。

我正在尝试对这些问题编写查询,但我被困住了......

【问题讨论】:

  • 这里。阅读this

标签: mysql sql many-to-many


【解决方案1】:

在为给定学生 ID 选择所有课程的情况下,您可以尝试以下操作,这将为与学生关联的每个课程返回一行。

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]),以便聚合结果根据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
;

【讨论】:

    猜你喜欢
    • 2021-11-28
    • 2020-02-03
    • 2022-10-02
    • 2018-08-28
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    相关资源
    最近更新 更多