WHERE子句AND/OR多条件组合异常:排除指定用户仍返回结果
问题原因与解决方案
嘿,这个问题我太熟悉了——这是SQL里运算符优先级在搞鬼!
你遇到的核心问题是:SQL中AND的优先级比OR高,这导致你的查询条件被数据库解析成了和你预期完全不同的逻辑。
你的原语句实际被解析成这样:
SELECT * FROM users WHERE (user_id!='1' AND fast_name LIKE '%asim%') OR last_name LIKE '%asim%' OR CONCAT(fast_name,' ',last_name) LIKE '%asim%'
看到了吗?数据库会先把user_id!='1'和fast_name LIKE '%asim%'绑定成一组,然后剩下的两个OR条件是独立判断的。也就是说,只要用户满足任意一个OR条件(哪怕user_id='1'),就会被返回。这就是为什么那个user_id=1、姓名是asim的用户出现在结果里——因为它匹配了后面的OR条件。
正确的写法应该是这样:
你需要用括号把所有姓名匹配的条件括起来,让它们成为一个整体,再和user_id!='1'用AND连接,确保只有user_id不是1,且姓名匹配任意一个条件的用户才会被选中:
SELECT * FROM users WHERE user_id!='1' AND ( fast_name LIKE '%asim%' OR last_name LIKE '%asim%' OR CONCAT(fast_name,' ',last_name) LIKE '%asim%' )
小提示
以后写包含AND和OR的WHERE子句时,一定要用括号明确分组逻辑,别依赖默认的运算符优先级。这样不仅能避免这类bug,代码的可读性也会高很多!
内容的提问来源于stack exchange,提问作者Mazhar Hussain
相关产品推荐
相关产品推荐

