多条件AND过滤正常,单条件s.date_to='0000-00-00'返回全表数据
问题原因排查方案
以下是几个最可能的原因及验证方法:
service表所有记录的date_to本来就是0000-00-00
当你加上s.court=13和s.place=7时,只是过滤掉了不符合这两个条件的记录,剩下的自然都满足date_to='0000-00-00';而当你只保留date_to条件时,所有记录都符合要求,所以返回全表数据。可以用这条SQL验证:SELECT DISTINCT date_to FROM `service`;如果结果只有
0000-00-00,那就是这个原因。date_to字段存在格式或类型问题
如果date_to是VARCHAR类型而非DATE/DATETIME,可能存在隐形空格或格式不一致的情况(比如'0000-00-00 '带空格),但恰好符合s.court=13 AND s.place=7的记录没有这类问题。可以用修剪函数排查:SELECT * FROM `service` WHERE TRIM(date_to) != '0000-00-00';如果有返回结果,说明存在格式脏数据。
date_to包含NULL值且SQL_MODE未限制零日期
若service表中date_to有NULL值,s.date_to='0000-00-00'不会过滤NULL行,但你说返回所有记录,大概率是NULL值占比极高。可以用这条SQL确认:SELECT COUNT(*) FROM `service` WHERE date_to IS NULL;
另外你提到换左连接没用,这是正常的——左连接只会保留service表的所有记录(即使关联表无匹配),但你的过滤条件是针对service表的date_to,写在WHERE子句里的话,连接类型不会影响这个条件的生效。
内容的提问来源于stack exchange,提问作者Kabilan S
相关产品推荐
相关产品推荐

