从多个表的{IN44 JOINS'中获取所有记录

时间:2018-06-04 14:07:13

标签: mysql inner-join multiple-tables

我有三张表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

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

任何帮助都将非常感谢!

2 个答案:

答案 0 :(得分:1)

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

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

因此,对于学生1,您的内部连接子句可以工作,因为它在所有连接表中都有数据。

现在,如果我们找你的学生3 =>与程度3 =>有关系的Bilal学士学位,但是这个学位没有指定的课程,这就是为什么你的学生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

在结果集中,由于与课程无关,您可以将以下列视为null

cdr_id,c_id,d_id,c_id,c_name,c_credit

答案 1 :(得分:-1)

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