MySQL查询疑问:添加日期限制后如何保留完整巴士学生状态列表
解决方案
问题出在你把左连接表的过滤条件放到了WHERE子句里。当使用左连接时,右表(STATevent)没有匹配的行对应的字段会是NULL,而WHERE子句里的O.date LIKE '2022-11-29%'会把这些NULL的行直接过滤掉,导致只保留有匹配记录的学生。
正确的做法是把右表的过滤条件(日期+level='bus',因为你只关心取消巴士的事件)放到LEFT JOIN的ON子句中,这样连接时就会只匹配符合条件的STATevent记录,同时保留左表(students)所有符合条件的行:
SELECT C.name, C.sid, O.sid AS 'bid', C.bus FROM students C LEFT JOIN STATevent O ON C.sid = O.sid AND O.level = 'bus' -- 只关联取消巴士的事件 AND O.date >= '2022-11-29' AND O.date < '2022-11-30' -- 用范围查询替代LIKE,更高效准确 WHERE C.bus LIKE 'Bus%' AND C.active = 'Yes';
补充说明:
- 把条件移到
ON子句后,左连接会保留所有符合WHERE条件的学生记录,即使他们没有对应的STATevent记录(此时bid会是NULL)。 - 用
O.date >= '2022-11-29' AND O.date < '2022-11-30'替代LIKE,可以利用日期索引(如果有的话),查询效率更高,也能准确匹配当天所有时间的记录。
内容的提问来源于stack exchange,提问作者sukebe7
相关产品推荐
相关产品推荐

