从多个表的内部联接获取所有记录

weylhg0b  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(382)

我有三张table tblCourse , tblDegree , tblStudent . 我创建了一个课程和学位关系表,如下所示 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

但这只返回一个学生的记录,而我在数据库中有两个学生请参见SQLFIDLE:
如何从joins查询中获取所有学生记录?
任何帮助都将不胜感激!

qncylg1j

qncylg1j1#

在您的例子中,您拥有所有的内部联接,因此它将返回两个/所有表都满足其条件的结果(on子句)。
查看你的数据你的学生1=>ali与学位1=>bs信息技术有关。进一步的学位1有课程(1=>编程,2=>英语,5=>数学,6=>电子)
所以对于student 1,内部join子句是有效的,因为它在所有连接的表中都有数据。
现在,如果我们寻找你的学生3=>bilal,他与学位3=>bs数学有关系,但是这个学位没有指定的课程,这就是为什么你的学生bilal没有被退回的原因
为了得到所有的学生,无论他们的相关学位有课程,你可以把你的内部连接到左连接不是所有的表,而是所有的表 tblcoursedegreerelation 以及 tblcourse ```
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

演示
在结果集中,由于与课程没有关联,您可以看到以下列为空
cdr\u id、c\u id、d\u id、c\u id、c\u name、c\u credit
blpfk2vs

blpfk2vs2#

做一个正确的连接 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

相关问题