Mysql SQL查看一个学生的所有课程

Mysql SQL查看一个学生的所有课程,mysql,sql,select,foreign-keys,Mysql,Sql,Select,Foreign Keys,我有三张桌子 表\u学生 身份证,姓,姓 课程表 ID,课程名称 学生课程表 ID,学生ID,课程ID,上课日期 我只想按ID=1的学生的课程名称和日期列出所有课程 有人吗?您需要使用表格(课程)和表格(学生)表格(课程)上的连接(JOIN)和表格(学生)课程(课程)表格)(课程)表格)表格)上的顺序 SELECT t.course_name, tsc.date_taken FROM table_courses t INNER JOIN tabl

我有三张桌子

表\u学生
身份证,姓,姓

课程表
ID,课程名称

学生课程表
ID,学生ID,课程ID,上课日期

我只想按ID=1的学生的课程名称和日期列出所有课程


有人吗?

您需要使用
表格(课程)
表格(学生)表格(课程)
上的
连接(JOIN)和
表格(学生)课程(课程)
表格)(课程)
表格)表格)上的
顺序

  SELECT 
      t.course_name,
      tsc.date_taken 
  FROM 
      table_courses t INNER JOIN table_student_course tsc
          ON t.ID = tsc.course_ID
  WHERE
      tsc.student_ID = 1
  ORDER BY 
       t.course_name
如果您还想从查询中获取学员的详细信息,则需要连接以下3个表

SELECT s.firstname, s.lastname, c.course_name, sc.date_taken 
FROM table_courses c 
INNER JOIN table_student_course sc ON c.ID = sc.course_ID
INNER JOIN table_student s ON sc.student_ID = s.ID
WHERE sc.student_ID = 1
ORDER BY c.course_name

通过在表“table_courses”和“table_student_course”上使用内部联接,我们从两个表中选择所有行,只要两个表中的列之间存在匹配,确保ID相同。如果满足条件(student_id=1),则查询将返回预期结果

SELECT course_name, date_taken
FROM table_courses c INNER JOIN table_student_course sc ON c.id = sc.course_id
WHERE sc.student_ID = 1
ORDER BY course_name

student_course表中的
id
做什么?只需连接所有3个表?我怀疑它是主键,MySQL中默认为集群键。这根本不是什么。我想你推断的是乔·塞尔科学派的思想,它是反代理键,但假设一个学生可以多次参加同一课程,你就必须使用
(学生ID,课程ID,参加日期)
来唯一地识别一个记录-这既不是狭隘的,也不是不断增加的,好的集群键的两个准则。如果有可能注册一门课程,那么就推迟开始,这样你就有了一个可以更改的主键,同样糟糕的练习。@GarethD我熟悉Celko的立场,但我并不反对代理键本身。假设同一个学生不能同时上两次课,那么在这种情况下,似乎有一个完全有效的自然钥匙。“被采取”的事情发生在过去,无法改变。“假设没有一门课程可以采取两次”-你为什么会这样假设?人们经常不及格,不得不重修。即使这个假设是正确的,因为这是MySQL,对主键的考虑必须延伸到集群键,仅仅因为您有一个有效的自然键,并不一定意味着这是一个好主意,正如所提到的,理想情况下集群键应该是静态的、狭窄的、唯一的并且不断增加。所以ID列仍然可以更好地满足这一点。谢谢你的拼写错误。我想知道这就是为什么投反对票。Downvoter必须是相当好的英语老师。:)如果你不知道如何接受它,请随意接受作为答案,对你的解决方案做进一步的解释这确实回答了问题-如果它向原始海报解释代码的基本要素是什么,这将是一个更好的答案。它被用在投票最多的答案中无论如何,最终
SELECT s.firstname, s.lastname, c.course_name, sc.date_taken 
FROM table_courses c 
INNER JOIN table_student_course sc ON c.ID = sc.course_ID
INNER JOIN table_student s ON sc.student_ID = s.ID
WHERE sc.student_ID = 1
ORDER BY c.course_name