【问题标题】:Inner join with 3 tables in mysqlmysql中3个表的内连接
【发布时间】: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

标签: mysql database inner-join


【解决方案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;

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 2016-08-31
    • 1970-01-01
    • 2015-08-20
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    相关资源
    最近更新 更多