mysql - 带过滤的多重连接
问题描述
我有 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|
解决方案
您可以将左连接表的条件放在 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。
推荐阅读
- flutter - NoSuchMethodError:在 null 上调用了 getter 'bloc'
- sql - PostgreSQL:根据分隔符将一个元素的数组拆分为多个元素并取消嵌套的查询
- java - 在android中从前置摄像头和后置摄像头拍摄图像后如何修复图像旋转度数?
- javascript - 如何在 Puppeteer 中等待 ElementHandle 对象单击操作
- php - 修改php中json数组的日期格式
- javascript - Cloudinary with Django - 在页面渲染后使用 javascript 动态增加/减少照片的宽度和高度
- android - Android:如何在不调用 onCreate 方法的情况下从服务后台恢复应用程序?
- api-key - Express-Gateway,提供相同的 API 路径/路由,但在不同的 ServiceEndpoints 下
- c++ - 如何在同一进程加载的两个 DLL 之间进行通信而不再次加载它们?
- google-chrome - 为 Google Chrome 开发工具窗口命名?