You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

多对多关联场景下查询同时属两部门用户的SQL解决方案

如何查询同时属于两个部门的用户?

嘿,我一眼就看出你原来查询的问题啦!你在WHERE里同时要求DP.IDDepartment = 1DP.IDDepartment = 2,但一条UserDepartment记录只能对应一个部门ID呀,这条件根本不可能满足,所以才返回0条结果~

下面给你几种靠谱的解决方案,按需选择就行:

方法一:分组统计法(灵活适配多部门场景)

这种方法适合需要同时匹配多个部门的情况,逻辑清晰还容易扩展:

SELECT u.ID, u.Name
FROM User u
JOIN UserDepartment ud ON u.ID = ud.IDUser
WHERE ud.IDDepartment IN (1, 2)
GROUP BY u.ID, u.Name
HAVING COUNT(DISTINCT ud.IDDepartment) = 2;

思路:先筛选出所有关联了目标部门的用户记录,然后按用户分组,统计每个用户关联的不同部门数量。只有数量等于目标部门数(这里是2)的用户,才说明同时属于所有目标部门。加DISTINCT是为了避免中间表存在重复关联记录的情况干扰统计结果。

方法二:多次连接法(直观的交集查询)

如果你只需要匹配两个部门,这种方法更直观,相当于找两个部门用户集合的交集:

SELECT u.ID, u.Name
FROM User u
JOIN UserDepartment ud1 ON u.ID = ud1.IDUser AND ud1.IDDepartment = 1
JOIN UserDepartment ud2 ON u.ID = ud2.IDUser AND ud2.IDDepartment = 2;

思路:把UserDepartment表连两次,第一次只拉取属于部门1的用户关联,第二次只拉取属于部门2的,只有同时满足两个连接条件的用户才会被保留下来。

方法三:EXISTS子查询法(性能友好的逻辑验证)

这种方法逻辑最直白,而且对于大数据表来说性能通常不错,因为EXISTS只要找到匹配记录就会停止查询:

SELECT u.ID, u.Name
FROM User u
WHERE EXISTS (
    SELECT 1 FROM UserDepartment ud 
    WHERE ud.IDUser = u.ID AND ud.IDDepartment = 1
)
AND EXISTS (
    SELECT 1 FROM UserDepartment ud 
    WHERE ud.IDUser = u.ID AND ud.IDDepartment = 2
);

思路:分别检查用户是否存在部门1和部门2的关联记录,只有两个条件都满足的用户才会被选中。如果要加更多部门,直接加新的EXISTS条件就行。

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

火山引擎 最新活动