You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 04:35:29