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

MySQL内连接多条件查询问题:筛选满足指定角色组合的用户

修正SQL:筛选同时拥有指定角色的用户

原SQL的核心问题是WHERE子句条件矛盾——r.role_id=1 AND r.role_id BETWEEN 2 AND 7要求同一行的role_id既要等于1,又要落在2-7区间,这显然不可能成立,导致逻辑完全错误。以下是几种可行的修正方案:

方案一:分组+HAVING统计(推荐)

先筛选出角色为1或2-4的记录,分组后通过条件统计验证两个角色要求都满足:

SELECT a.*
FROM `user_info` a 
INNER JOIN `user_role_info` r ON r.`user_id` = a.`user_id`
WHERE r.`role_id` = 1 OR r.`role_id` BETWEEN 2 AND 4
GROUP BY a.`user_id`
HAVING 
    SUM(CASE WHEN r.`role_id` = 1 THEN 1 ELSE 0 END) >= 1
    AND SUM(CASE WHEN r.`role_id` BETWEEN 2 AND 4 THEN 1 ELSE 0 END) >= 1;

该方案逻辑清晰,通过精准的条件统计避免误判,能准确筛选出同时满足两个角色要求的用户。

方案二:使用EXISTS子查询

通过两次EXISTS子查询分别验证用户是否拥有目标角色,逻辑直观且性能表现较好:

SELECT *
FROM `user_info` a
WHERE 
    EXISTS (SELECT 1 FROM `user_role_info` r WHERE r.`user_id` = a.`user_id` AND r.`role_id` = 1)
    AND EXISTS (SELECT 1 FROM `user_role_info` r WHERE r.`user_id` = a.`user_id` AND r.`role_id` BETWEEN 2 AND 4);

如果user_role_info表有user_id+role_id的联合索引,该方案能快速定位符合条件的记录。

方案三:两次JOIN关联角色表

通过两次内连接分别匹配不同角色的记录,需注意去重避免重复结果:

SELECT DISTINCT a.*
FROM `user_info` a
INNER JOIN `user_role_info` r1 ON r1.`user_id` = a.`user_id` AND r1.`role_id` = 1
INNER JOIN `user_role_info` r2 ON r2.`user_id` = a.`user_id` AND r2.`role_id` BETWEEN 2 AND 4;

DISTINCT用于排除用户拥有多个2-4角色时产生的重复行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:10:40