我有一个类列表和两个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
我做错了什么?
答案 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
。