You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 (SELECT block FROM block WHERE user = '1'),确认这部分已经排除了被屏蔽用户
  • 再看原语句的OR部分,是不是把被屏蔽但nome含uk的用户又加回来了

这样就能直观看到问题所在啦!

内容的提问来源于stack exchange,提问作者RGS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:03:38