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

MySQL中LEFT JOIN多条件查询异常,日期筛选问题求助

解决MySQL LEFT JOIN中日期筛选的问题

看起来你遇到的问题大概率是日期条件的写法或者位置不对导致的,咱们一步步拆解解决:

1. 先说说你原来日期条件的问题

你用了DATE_FORMAT((lp.date_p_in), '%d-%m-%Y') LIKE DATE_FORMAT((NOW()), '%d-%m-%Y'),这里有两个小坑:

  • 首先,LIKE在这里完全没必要——你是要精确匹配今日日期,用=就够了,LIKE是用来模糊匹配的,虽然结果可能一样,但多此一举;
  • 其次,把日期类型转成字符串再比较,不仅性能差(没法用到date_p_in上的索引),还可能因为格式细节(比如前导零、字符编码)导致匹配失败。

2. 替换成更靠谱的日期筛选方式

根据lp.date_p_in的数据类型,选下面的写法:

如果lp.date_p_in是DATE类型

直接匹配今日日期就行:

lp.date_p_in = CURDATE()

如果是DATETIME/TIMESTAMP类型(带时分秒)

推荐两种写法:

  • 简单直观版(但可能无法用到索引):
DATE(lp.date_p_in) = CURDATE()
  • 高性能版(能用到索引,优先推荐):
lp.date_p_in >= CURDATE() 
AND lp.date_p_in < CURDATE() + INTERVAL 1 DAY

这个写法是筛选从今日00:00:00到明日00:00:00之间的所有数据,比用DATE()函数更高效。

3. 关键:注意LEFT JOIN中条件的位置!

这可能是你结果不符合预期的核心原因:
如果你的日期条件写在WHERE子句里,会把LEFT JOIN变成INNER JOIN的效果——因为LEFT JOIN本应保留左表所有行,哪怕右表没有匹配的数据,但WHERE里的日期条件会过滤掉那些右表没有今日数据的行。

正确的位置选择:

  • 如果你想保留左表所有行,只关联右表的今日数据:把日期条件放到LEFT JOIN的ON子句里,比如:
SELECT *
FROM 左表 t1
LEFT JOIN lp ON t1.id = lp.t1_id 
  AND lp.date_p_in >= CURDATE() 
  AND lp.date_p_in < CURDATE() + INTERVAL 1 DAY
  • 如果你只想保留左表中存在右表今日数据的行:把日期条件放到WHERE子句里,这时候其实和INNER JOIN效果一致。

4. 测试验证

把上面的写法替换进去,应该就能得到你想要的今日数据结果了。

内容的提问来源于stack exchange,提问作者youssef

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:15:47