用于筛选多对多的SQL查询

用于筛选多对多的SQL查询,sql,postgresql,many-to-many,Sql,Postgresql,Many To Many,我将用户、组和用户组表设置如下: 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 |

我将用户、组和用户组表设置如下:

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的成员时,如果只希望所有3个组中的用户使用,则返回[1]

select user_id
from users_groups ug
where group_id in (1,2,3)
group by user_id
having count(distinct group_id) = 3

基本上,您可以通过聚合和计算条目的数量来实现这一点。您可以通过简单的查询(如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;

+1为此,我一直在忙着用函数创建小提琴演示,所以在您之后回答:)