从多个表的 INNER JOINS 获取所有记录
Getting all records from INNER JOINS of multiple tables
我有三个table tblCourse
, tblDegree
, tblStudent
。我创建了一个课程和学位关系 table,就像 tblCourseDegreeRelation
。这个关系 table 使用外键当然和学位 table 就像:
我需要使用此查询获取所有记录,包括 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
But this only returns the one student's record while I've two students in the database see SQLFiddle:
如何从连接查询中获取所有学生的记录?
任何帮助将不胜感激!
只需在 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
在您的情况下,您拥有所有内部联接,因此它会 return 结果 both/all 表满足其条件(on 子句)。
查看您的数据您的学生 1 => Ali 与学位 1 =>BS Information Technology 有关系。
进一步的学位 1 有课程(1 => 编程,2 => 英语,5=> 数学,6 => 电子)
因此对于学生 1,您的内部连接子句有效,因为它在所有连接表中都有数据。
现在,如果我们寻找您的学生 3 => Bilal,他与学位 3 有关系 => BS 数学,但是这个学位没有指定的课程,这就是为什么您的学生 Bilal 没有 returned
为了让所有学生无论他们的相关学位是否有课程,您都可以将您的内部联接变成左联接,但不是针对所有表,而是针对 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_id、c_id、d_id、c_id、c_name、c_credit
我有三个table tblCourse
, tblDegree
, tblStudent
。我创建了一个课程和学位关系 table,就像 tblCourseDegreeRelation
。这个关系 table 使用外键当然和学位 table 就像:
我需要使用此查询获取所有记录,包括 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
But this only returns the one student's record while I've two students in the database see SQLFiddle:
如何从连接查询中获取所有学生的记录?
任何帮助将不胜感激!
只需在 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
在您的情况下,您拥有所有内部联接,因此它会 return 结果 both/all 表满足其条件(on 子句)。
查看您的数据您的学生 1 => Ali 与学位 1 =>BS Information Technology 有关系。 进一步的学位 1 有课程(1 => 编程,2 => 英语,5=> 数学,6 => 电子)
因此对于学生 1,您的内部连接子句有效,因为它在所有连接表中都有数据。
现在,如果我们寻找您的学生 3 => Bilal,他与学位 3 有关系 => BS 数学,但是这个学位没有指定的课程,这就是为什么您的学生 Bilal 没有 returned
为了让所有学生无论他们的相关学位是否有课程,您都可以将您的内部联接变成左联接,但不是针对所有表,而是针对 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_id、c_id、d_id、c_id、c_name、c_credit