我将用户,组和users_groups表设置如下:
users
id int
groups
id int
users_groups
user_id int
group_id int
示例数据
+-------+--------+
|user_id|group_id|
+-------+--------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 3 | 2 |
| 3 | 3 |
+-------+--------+
有没有办法选择属于具有未知大小的组子集的所有用户?这基本上是基于组ID进行过滤。
例如,为组1和组2的成员返回用户ID的查询将返回[1,2]的用户ID,但是当要求组1,2和3的成员返回[1]的用户ID时]
答案 0 :(得分:1)
如果您只希望所有3个群组中的用户使用
select user_id
from users_groups ug
where group_id in (1,2,3)
group by user_id
having count(distinct group_id) = 3
答案 1 :(得分:1)
基本上你可以通过聚合和计算条目数来做到这一点。您可以通过简单查询来完成此操作,例如juergen_d,或者使用如下函数:
create function fn_users_groups(_groups int[])
returns table(user_id int)
as
$$
select user_id
from users_groups
where group_id = any(_groups)
group by user_id
having count(*) = array_length(_groups, 1)
$$
language sql;
<强> => sql fiddle demo 强>