MySQL搜索无法排除被屏蔽用户,请求排查SQL语句问题
问题分析与解决方案
嘿,我一眼就看出问题出在逻辑运算符的优先级上啦!SQL里AND的优先级比OR高,所以你原语句的实际执行逻辑被拆成了:
(排除被屏蔽用户 且 c.user LIKE '%uk%') 或者 (c.nome LIKE '%uk%')
这就导致只要用户的nome包含uk,哪怕他是被屏蔽的对象,也会绕过屏蔽条件直接出现在结果里。
修正后的SQL语句
把OR连接的两个模糊查询条件用括号括起来,让整个过滤逻辑变成:排除被屏蔽用户,并且(user含uk 或 nome含uk),代码如下:
SELECT c.nome, c.user, c.id FROM users c WHERE c.id NOT IN (SELECT `block` FROM block WHERE user = '1') AND (c.user LIKE '%uk%' OR c.nome LIKE '%uk%');
更可靠的替代方案(推荐)
用NOT EXISTS替代NOT IN会更稳妥——如果block表的block字段出现NULL值,NOT IN会直接返回空结果,而NOT EXISTS不受这个影响,性能也更优:
SELECT c.nome, c.user, c.id FROM users c WHERE NOT EXISTS ( SELECT 1 FROM block b WHERE b.user = '1' AND b.`block` = c.id ) AND (c.user LIKE '%uk%' OR c.nome LIKE '%uk%');
验证小技巧
你可以把原语句拆成两部分单独执行:
- 先执行
SELECT c.nome, c.user, c.id FROM users c WHERE c.id NOT IN (SELECTblockFROM block WHERE user = '1'),确认这部分已经排除了被屏蔽用户 - 再看原语句的
OR部分,是不是把被屏蔽但nome含uk的用户又加回来了
这样就能直观看到问题所在啦!
内容的提问来源于stack exchange,提问作者RGS
相关产品推荐
相关产品推荐

