【问题标题】:Getting all records from INNER JOINS of multiple tables从多个表的 INNER JOINS 中获取所有记录
【发布时间】:2018-06-04 14:07:13
【问题描述】:

我有三个表tblCoursetblDegreetblStudent。我创建了一个课程和学位关系表,如tblCourseDegreeRelation。这个关系表当然使用外键和学位表,如下所示:

我需要使用此查询获取所有记录,包括 tblStudent 所有记录:

SELECT * from tbldegree d
INNER JOIN tblcoursedegreerelation cdr ON d.d_id = cdr.d_id
INNER JOIN tblcourse c ON cdr.c_id = c.c_id
INNER JOIN tblstudent s ON d.d_id = s.d_id
ORDER BY cdr.cdr_id DESC

但这只会返回一个学生的记录,而我在数据库中有两个学生,请参阅SQLFiddle

如何从联接查询中获取所有学生记录?

任何帮助将不胜感激!

【问题讨论】:

  • 如果您添加的表格截图是正确的,我看不到第二个学生拥有的学位 id 3 的课程学位映射..确保您的这个映射可用
  • @Hiren 这个映射可用我给了一半截图。
  • 如果您可以使用示例数据集创建包含所有表定义的 sqlfiddle.com 示例并与我们共享链接,那就太好了
  • @MKhalidJunaid OP 已经明确表示他们对此不感兴趣。我怀疑温和的重复会影响他们:-(

标签: mysql inner-join multiple-tables


【解决方案1】:

在您的情况下,您拥有所有内部联接,因此它将返回两个/所有表都满足其条件(on 子句)的结果。

查看您的学生数据 1 => Ali 与学位 1 => BS 信息技术有关系。 进一步的学位 1 有课程(1 => 编程,2 => 英语,5=> 数学,6 => 电子)

因此,对于学生 1,您的内部联接子句有效,因为它在所有联接表中都有数据。

现在,如果我们寻找您的学生 3 => 与学位 3 有关系的 Bilal => BS 数学,但是该学位没有指定课程,这就是您的学生 Bilal 没有返回的原因

要让所有学生无论其相关学位是否有课程,您都可以将内连接变为左连接,而不是针对所有表格,而是针对 tblcoursedegreerelationtblcourse

SELECT * 
FROM tblstudent s 
INNER JOIN tbldegree d ON d.d_id = s.d_id
LEFT JOIN tblcoursedegreerelation cdr ON d.d_id = cdr.d_id
LEFT JOIN tblcourse c ON cdr.c_id = c.c_id
ORDER BY cdr.cdr_id DESC

Demo

在结果集中,由于与课程没有关联,您可以看到以下列为空

cdr_id, c_id, d_id, c_id, c_name, c_credit

【讨论】:

  • 很好的解释是的,这就是我考虑谢谢的原因。
【解决方案2】:

只需在tblstudent 上进行右连接:

SELECT * from tbldegree d
INNER JOIN tblcoursedegreerelation cdr ON d.d_id = cdr.d_id
INNER JOIN tblcourse c ON cdr.c_id = c.c_id
RIGHT JOIN tblstudent s ON d.d_id = s.d_id
ORDER BY cdr.cdr_id DESC

编辑 这种方式比较好:

SELECT c.d_id,c.d_name,c.d_fee,cdr.cdr_id,cdr_c_id,deg.c_name,deg.d_credit,a.s_id,a.s_name
FROM tblstudent a
     left join tblDegree c ON a.d_id = c.d_id
     left join tblcoursedegreerelation cdr ON cdr.d_id=c.d_id
     left join tblcourse deg on deg.c_id=cdr.c_id

ORDER BY cdr.cdr_id DESC

【讨论】:

  • 请注意,没有人使用 RIGHT JOIN
  • 请不要使用SELECT *
  • 不,它仍然没有得到所有数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
  • 2017-07-25
  • 2016-08-04
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
相关资源
最近更新 更多