我通过连接表在用户和组之间建立了典型的m:m关系。每个用户都可以成为多个组的一部分。
users
-------
id
name
groups
-------
id
name
user_groups
------------
id
user_id
group_id
我想尝试查找多个组中的所有用户。例如,组3,4,5中的所有用户。请注意,用户必须属于所有这些组。
首先我尝试了以下操作,但当然这不正确,因为这会返回OR
结果,而不是AND
SELECT DISTINCT u.*
FROM users u
LEFT JOIN user_groups ug on u.id = ug.user_id
where ug.group_id in (3, 4, 5)
我也尝试为我正在搜索的每个group_id(有效)进行单独的连接,但效率不高。
如何才能最好地实现
答案 0 :(得分:0)
尝试这样的事情
SELECT
u.id, u.name
FROM users u
LEFT JOIN user_groups ug on u.id = ug.user_id
WHERE ug.group_id in (3, 4, 5)
GROUP BY u.id, u.name
HAVING COUNT(u.id) = 3
GROUP BY
和HAVING COUNT
强制查询查找所有3个组中的用户。
编辑:如果您不想使用GROUP BY
一种丑陋的方式,那就是使用EXISTS
SELECT
u.id, u.name
FROM users u
WHERE
EXISTS (SELECT 1 FROM user_groups ug
WHERE u.id = ug.user_id AND ug.group_id = 3)
AND EXISTS (SELECT 1 FROM user_groups ug
WHERE u.id = ug.user_id AND ug.group_id = 4)
AND EXISTS (SELECT 1 FROM user_groups ug
WHERE u.id = ug.user_id AND ug.group_id = 5)
答案 1 :(得分:0)
如果您想获得有关用户的所有信息,请尝试此操作:
select *
from users u
join (
select user_id
from user_groups
where group_id in (3, 4, 5)
group by user_id
having count(*) > 1
) ugr on u.id = ugr.user_id
如果您希望输出如下:user_id, user_name, count(*)
,那么:
select u.id as user_id, u.user_name, count(*)
from user_groups ugr
, users u
where u.id = ugr.user_id
and ugr.group_id in (3, 4, 5)
group by u.id, u.username
having count(*) > 1
根据您的需要调整where group_id in (3, 4, 5)
。
答案 2 :(得分:0)
此查询应该有效,它应该返回所有常见的user_id
。
select user_id
from user_groups
where user_id in (
select user_id
from user_groups
where group_id = 3
and user_id in (
select user_id
from user_groups
where group_id = 2
and user_id in (
select user_id
from groups
where group_id = 1
)
)
)