mysql中3个表的内连接

Posted

技术标签:

【中文标题】mysql中3个表的内连接【英文标题】:Inner join with 3 tables in mysql 【发布时间】:2013-04-07 11:02:44 【问题描述】:

我想使用内连接从更多表中选择数据。

这些是我的桌子。

Student (studentId, firstName, lastname)
Exam (examId, name, date)
Grade (gradeId, fk_studentId, fk_examId, grade)

我想写一份声明,说明学生参加过的考试、年级和日期。按日期排序。

这是我的声明。它运行,但我想确保我做的正确。

SELECT
  student.firstname,
  student.lastname,
  exam.name,
  exam.date,
  grade.grade
FROM grade
  INNER JOIN student
    ON student.studentId = grade.gradeId
  INNER JOIN exam
    ON exam.examId = grade.gradeId
ORDER BY exam.date

【问题讨论】:

其中有什么问题? gradeID 列连接到 studentID 看起来很奇怪?但是,如果您以这种方式放置结构并返回您期望的结果,那么我想这很好... 是的,你做得对。虽然它是否有效并给出了预期的结果,但没有太多指向这个问题? 在我看来,student.studendId =grade.fk_studentId 和 Exam.examId =grade.fk_examId 是的,你是对的***.com/questions/14673338/… 【参考方案1】:

正确的说法应该是:

SELECT
  student.firstname,
  student.lastname,
  exam.name,
  exam.date,
  grade.grade
FROM grade
  INNER JOIN student
    ON student.studentId = grade.fk_studentId
  INNER JOIN exam
    ON exam.examId = grade.fk_examId
ORDER BY exam.date

根据定义的外键关系引用其他表。如果您希望数据显示为已查询,则应正确引用 ID。因此,您应该将 id 引用到表中正确的外键,而不是仅仅引用没有定义正确关系的 id

【讨论】:

运行语句时。是说错误代码:1054。'on 子句'中的未知列'grade.fk_studentId' @user2231285 您将等级表定义为Grade (gradeId, fk_studentId, fk_examId, grade)。所以它应该有查询中写的列 这个答案,而不是关于这个主题的另一个高度评价的答案。 @AjoKoshy 非常好的回应,谢谢。【参考方案2】:

几乎正确..查看连接,您指的是错误的字段

SELECT student.firstname,
       student.lastname,
       exam.name,
       exam.date,
       grade.grade
  FROM grade
 INNER JOIN student ON student.studentId = grade.fk_studentId
 INNER JOIN exam ON exam.examId = grade.fk_examId
 ORDER BY exam.date

【讨论】:

运行语句时。是说错误代码:1054。'on 子句'中的未知列'grade.fk_studentId' - 和@AjoKoshy 给你的答案一样!它接缝你没有字段grade.fk_studentId,所以你必须使用正确的字段。【参考方案3】:
SELECT
  student.firstname,
  student.lastname,
  exam.name,
  exam.date,
  grade.grade
FROM grade
 INNER JOIN student
   ON student.studentId = grade.fk_studentId
 INNER JOIN exam
   ON exam.examId = grade.fk_examId
 GROUP BY grade.gradeId
 ORDER BY exam.date

【讨论】:

请解释GROUP BY 子句在此处的相关性?【参考方案4】:

更专业的代码编写方式是使用“别名”-

SELECT
  s.firstname,
  s.lastname,
  e.name,
  e.date,
  g.grade
FROM grade AS g
 INNER JOIN student AS s
   ON s.studentId = g.fk_studentId
 INNER JOIN exam AS e
   ON e.examId = g.fk_examId
 ORDER BY e.date;

【讨论】:

以上是关于mysql中3个表的内连接的主要内容,如果未能解决你的问题,请参考以下文章

MySql表的内连和外连

26.MySQL中的内连接INNER JOIN

MySQL 表的内连和外连

Mysql的内连接,外链接,交叉链接

MySQL中的内连接左连接右连接全连接交叉连接

MySQL 的内连接、左连接、右连接有啥区别?