SQL联合使用LIKE、OR、AND查询时返回deleted=1数据如何修复
问题根因
SQL逻辑运算符存在固定执行优先级:AND 的运算优先级高于 OR。你当前编写的WHERE子句,实际被数据库解析执行的逻辑等价于:
WHERE nomor_formulir LIKE '%mikha%' OR (harga_pelita LIKE '%5%' AND deleted=0)
按照这个逻辑,只要记录满足nomor_formulir LIKE '%mikha%',无论deleted字段取值是0还是1,都会被纳入结果集,这就是返回结果中出现deleted=1记录的直接原因。
基础修正方法
使用圆括号明确包裹由OR连接的两个模糊匹配条件,强制调整运算优先级:先计算两个匹配规则的或逻辑,再将结果和deleted=0做与逻辑校验。修正后的语句如下:
SELECT * FROM table_tutup_kas LEFT JOIN table_formulir_pelita ON table_formulir_pelita.id_formulir = table_tutup_kas.id_formulir WHERE (nomor_formulir LIKE '%mikha%' OR harga_pelita LIKE '%5%') AND deleted = 0
其他可选实现方案
- 提前过滤关联数据:如果
deleted字段归属明确(比如属于左表table_tutup_kas),可以将过滤条件拆分到关联子句中,提前裁剪参与关联计算的数据量,提升查询效率;如果右表也存在删除标记需要过滤,也可以同步在ON子句中添加对应条件:
SELECT * FROM table_tutup_kas LEFT JOIN table_formulir_pelita ON table_formulir_pelita.id_formulir = table_tutup_kas.id_formulir AND table_formulir_pelita.deleted = 0 -- 按需添加,过滤右表已删除数据 WHERE (nomor_formulir LIKE '%mikha%' OR harga_pelita LIKE '%5%') AND table_tutup_kas.deleted = 0
- 改用内关联提升性能:如果业务场景不需要保留左表中未匹配到右表记录的结果,可以将
LEFT JOIN替换为INNER JOIN,数据库执行时的查询效率会明显提升:
SELECT * FROM table_tutup_kas INNER JOIN table_formulir_pelita ON table_formulir_pelita.id_formulir = table_tutup_kas.id_formulir WHERE (nomor_formulir LIKE '%mikha%' OR harga_pelita LIKE '%5%') AND deleted = 0
实操提示:如果两个关联表都存在
deleted、nomor_formulir、harga_pelita这类同名字段,建议在字段前添加表名前缀做明确指向,避免触发字段歧义报错。
内容的提问来源于stack exchange,提问作者mikk
相关产品推荐
相关产品推荐

