用于筛选多对多的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为此,我一直在忙着用函数创建小提琴演示,所以在您之后回答:)