0

我的用户、组和 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 的成员时,返回的用户 ID 为 [1]

4

2 回答 2

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 小提琴演示

于 2013-10-15T10:09:35.990 回答
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
于 2013-10-15T10:02:52.443 回答