多重连接并过滤

时间:2019-03-04 17:00:55

标签: mysql sql join left-join

我有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|

1 个答案:

答案 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。