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
相关产品推荐
相关产品推荐

