Sql 查找所有重复组,其中“重复”表示包含相同成员的组

Sql 查找所有重复组,其中“重复”表示包含相同成员的组,sql,postgresql,bookshelf.js,knex.js,Sql,Postgresql,Bookshelf.js,Knex.js,我需要一个SQL查询来查找所有重复的组。所谓重复,我指的是任何拥有相同成员的组。因此,正式地说,问题可以写出来:返回所有通道ID集合,其中在包含m个通道的给定集合中:通道i到m包含相同的成员。我有一个包含列group\U id、user\U id的join表groups\U members,以及一个users表和一个groups表。谢谢你的帮助 您需要使用WHERE IN子句,然后在子查询中使用GROUP BY和HAVING子句,您可以说类似于HAVING COUNT*>1的语句来查找重复项。谢

我需要一个SQL查询来查找所有重复的组。所谓重复,我指的是任何拥有相同成员的组。因此,正式地说,问题可以写出来:返回所有通道ID集合,其中在包含m个通道的给定集合中:通道i到m包含相同的成员。我有一个包含列group\U id、user\U id的join表groups\U members,以及一个users表和一个groups表。谢谢你的帮助

您需要使用WHERE IN子句,然后在子查询中使用GROUP BY和HAVING子句,您可以说类似于HAVING COUNT*>1的语句来查找重复项。

谢谢。我终于明白了


选择array\u aggDISTINCT a.channel\u id作为频道,a.members from select channel\u id,array\u agguser\u id作为成员从users\u channels group by channel\u id a加入选择channel\u id,array\u agguser\u id作为成员从users\u channels group by channel\u id b ON a.members=b和a.channel\u id b.channel\u id组by a.members

您可以使用完全联接并查看是否有任何用户id为null,这意味着有一个用户在一个组中,而不是在另一个组中

select gm1.id, gm2.id from group_members gm1
full join group_members gm2 on gm2.user_id = gm1.user_id
where gm1.id < gm2.id
group by gm1.id, gm2.id
having count(case when gm1.user_id is null 
  or gm2.user_id is null then 1 end) = 0

哈哈,不,这不是家庭作业。形式只是b/c,通过正式的问题陈述可以清楚地理解。
select g.* from groups g1
join groups g2 on g2.id < g1.id
where not exists (
    select 1 from group_members gm1
    left join group_members gm2 on gm1.user_id = gm2.user_id and gm2.id = g2.id
    where gm1.group_id = g1.id
    and gm2.user_id is null
) and not exists (
    select 1 from group_members gm1
    left join group_members gm2 on gm1.user_id = gm2.user_id and gm2.id = g1.id
    where gm1.group_id = g2.id
    and gm2.user_id is null 
)