用于过滤多对多的SQL查询

时间:2013-10-15 09:59:47

标签: sql postgresql many-to-many

我将用户,组和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时]

2 个答案:

答案 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