SQL查询WHERE条件被忽略,始终返回全部结果问题求助
问题分析与解决
核心原因:逻辑运算符优先级错误
SQL中AND的优先级高于OR,你的原语句里,OR会将前面的条件拆分,最终逻辑等价于:(EXISTS(...) AND created_at LIKE '2023-04-04%') OR updated_at LIKE '2023-04-04%'
这意味着只要updated_at匹配日期条件,无论前面的EXISTS子查询是否成立,都会返回对应行,导致WHERE条件被“忽略”的假象。修正方案
用括号包裹日期相关条件,确保它们与前面的EXISTS子查询是“且”的关系:SELECT `status`, count(*) AS count FROM `wa_re_jo` WHERE EXISTS ( SELECT * FROM `ad_ac_wa` WHERE `plattform` = 'adwords' AND `wa_re_jo`.`watchlist_id` = `ad_ac_wa`.`id` AND EXISTS ( SELECT * FROM `ad_cu_ac` WHERE `ad_ac_wa`.`external_id` = `ad_cu_ac`.`externalId` AND EXISTS ( SELECT * FROM `ç` -- 注意:此处关联条件疑似错误,同一表字段相等大概率不符合业务预期 -- 建议修正为关联`ç`表的对应字段,比如 `ç.id = ad_cu_ac.adwords_customer_account_id` WHERE `ad_cu_ac`.`id` = `ad_cu_ac`.`adwords_customer_account_id` AND `startDate` <= '2023-04-04' AND `endDate` + interval 1 DAY >= '2023-04-04' ) ) ) AND ( `created_at` LIKE '2023-04-04%' OR `updated_at` LIKE '2023-04-04%' ) GROUP BY `status`额外优化建议
- 处理日期字段时,避免用
LIKE,改用DATE()函数更准确高效:
若DATE(`created_at`) = '2023-04-04' OR DATE(`updated_at`) = '2023-04-04'created_at和updated_at为datetime类型,该写法更清晰,还能利用字段索引(如果存在)。 - 检查最内层子查询的关联条件:
ad_cu_ac.id = ad_cu_ac.adwords_customer_account_id是同一表字段相等,除非业务逻辑明确要求,否则大概率是笔误,需修正为关联ç表的对应字段。 - 表名
ç疑似输入错误,建议确认是否为正确表名。
- 处理日期字段时,避免用
内容的提问来源于stack exchange,提问作者spyro95
相关产品推荐
相关产品推荐

