我有3张桌子
组
idG
学生
idS
idG
评分
idR
idS
date
关系是1(组)-∞(学生),1(学生)-∞(评分)
我需要选择idG为1的所有Group(例如)JOIN具有LEFT JOIN评分的学生,其中日期介于两者之间。
我试图使用这样的查询
SELECT *
FROM `group` AS g
JOIN student
ON g.idG = 1
LEFT JOIN rating
ON rating.idR = student.idS
WHERE rating.`date` between '2019-02-01' and '2019-02-28';
此查询的结果集是在日期之间具有评分的组的学生,但是据我所知,左联接必须为在日期之间没有评分的学生获取NULL评分。我期待这个结果
idG | idS | idR | date|
1 | 1 | NULL | NULL|
1 | 2 | 1 | 2019-02-08|
1 | 3 | 3 | 2019-02-10|
1 | 4 | NULL | NULL|
答案 0 :(得分:1)
您可以将左侧连接表的条件放入JOIN。
SELECT grp.idG, stu.idS, rat.idR, rat.`date`
FROM student stu
JOIN `group` AS grp
ON grp.idG = stu.idG
LEFT JOIN rating rat
ON rat.idS = stu.idS
AND rat.`date` BETWEEN '2019-02-01' AND '2019-02-28'
WHERE stu.idG = 1;
LEFT JOIN的作用是,当您还希望那些不匹配的项时,联接表的WHERE子句中的条件将丢弃所有不匹配项。
因为它随后将丢弃联接右侧的NULL。