首页 > 解决方案 > 带过滤的多重连接

问题描述

我有 3 个表

idG


学生

idS 
idG


评分

idR
idS
date

关系是 1(Group)-∞(Student),1(Student)-∞(Rating)
我需要选择 idG 为 1 的所有 Group(例如)JOIN Student with LEFT JOIN Rating 其中日期介于两者之间。我试图使用这样的查询

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|

标签: mysqlsqljoinleft-join

解决方案


您可以将左连接表的条件放在 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。


推荐阅读