如何对三个不能工作的表的外连接进行排序?

时间:2016-12-09 01:05:36

标签: mysql join

我有一个类列表和两个mySQL表中的用户列表。 因为它是两个表之间的多重关系,所以我确实有第三个表允许我将几个用户与几个课程联系起来,反之亦然。

结构是(所有非空值):

班级表

classID

用户表

userID
enrollementDate

classesUsers表

classID
userID

现在,我想显示所有可用类的列表,并在该列表中显示用户X注册的类。

我无法做到。要么我显示所有类,要么显示用户id 10注册的所有类。

所需的输出是:

ClassID -------- enrollementDate
Class 1 -------- 10-10-2010
Class 2     
Class 3 -------- 05-05-2015
Class 4     
Class 5 -------- 15-02-2016

我正在尝试这个,我确实得到了整个清单:

SELECT 
classes.classID,
users.enrollementDate

FROM classes
LEFT OUTER JOIN classesUsers
ON classes.classID = classesUsers.classID

LEFT JOIN users
ON classesUsers.userID = users.userID

GROUP BY classes.classID

如果我想添加特定用户,我只会获得该用户注册课程的列表:

SELECT 
classes.classID,
users.enrollementDate

FROM classes
LEFT OUTER JOIN classesUsers
ON classes.classID = classesUsers.classID

LEFT JOIN users
ON classesUsers.userID = users.userID

WHERE users.userID = 10
GROUP BY classes.classID

我做错了什么?

2 个答案:

答案 0 :(得分:1)

将用户检查从WHERE子句移到ON子句:

SELECT t1.classID,
       t2.userID,
       t3.enrollementDate
FROM classes t1
LEFT JOIN classesUsers t2
    ON t1.classID = t2.classID
LEFT JOIN users t3
    ON t2.userID = t3.userID AND
       t3.userID = 10

您的WHERE子句中的检查完全删除了不匹配的记录。但是您希望所有记录都出现在结果集中,尽管有些记录可能是空的。

答案 1 :(得分:1)

执行LEFT JOIN时,必须在ON子句中对子表进行限制。否则,您将过滤掉所有不匹配的行,因为他们在NULL列中会有users.userID,并且与WHERE users.userID = 10不匹配。

SELECT 
    classes.classID,
    classesUsers.userID,
    users.enrollementDate
FROM classes
LEFT OUTER JOIN classesUsers ON classes.classID = classesUsers.classID AND classesUsers.userID = 10
LEFT JOIN users ON classesUsers.userID = users.userID

不需要GROUP BY,因为每个类只会出现一次:如果没有匹配,则只有一个NULL行,或者与一个匹配的行匹配在classesUsers