首页 > 解决方案 > 从多对多关系表中过滤项目

问题描述

我有一张“多对多”的桌子many_relation

所以这个想法是让许多集合代表元素的“组”(1到许多元素)

我想做的是能够选择set_id包含给定元素的所有集合 ( )。例如,如果元素是 [1,2,3] 并且集合是 [a,b] 想象:

关系ID 设置名称 element_id
11111 一个 1
222222 一个 2
333333 b 1
444444 b 3

我希望能够:

我有以下 SQL:

SELECT mr.set_id
FROM many_relation mr
  INNER JOIN element el ON mr.element_id = el.id
WHERE el.id in ('1', '2')
group by mr.set_id
having count(*) = 2

但我不确定这是怎么做的,我不喜欢计数部分..有什么想法吗?

标签: sqlpostgresqlmany-to-many

解决方案


您可以使用group byhaving

select set_id
from many_relation
where element_id in (1, 2)
group by set_id
having count(*) = 2;  -- the "2" is the number of items in the `in` list

编辑:

在 Postgres 中,您可以使用数组来执行此操作。例如:

select set_id
from many_relation
where element_id = any (array[1, 2])
group by set_id
having count(*) = cardinality(array[1, 2]);

为了清楚起见,这重复了阵列。您可以使用 CTE 定义它(例如)。但是,我怀疑您将它作为参数传递,所以?在这两个地方都可以。


推荐阅读