sql - 从多对多关系表中过滤项目
问题描述
我有一张“多对多”的桌子many_relation
:
relation_id
唯一身份set_id
链接到另一个带有集合的表element_id
链接到另一个包含元素的表
所以这个想法是让许多集合代表元素的“组”(1到许多元素)
我想做的是能够选择set_id
包含给定元素的所有集合 ( )。例如,如果元素是 [1,2,3] 并且集合是 [a,b] 想象:
- set 'a' 被“链接”到元素 1 和 2
- set 'b' is 'linked' 到元素 1 和 3,那么表格
many_relation
将是:
关系ID | 设置名称 | element_id |
---|---|---|
11111 | 一个 | 1 |
222222 | 一个 | 2 |
333333 | b | 1 |
444444 | b | 3 |
我希望能够:
- 选择链接到元素 1 的集合 => [a,b]
- 选择链接到元素 1 和 2 的集合 => [a]
我有以下 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
但我不确定这是怎么做的,我不喜欢计数部分..有什么想法吗?
解决方案
您可以使用group by
和having
:
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 定义它(例如)。但是,我怀疑您将它作为参数传递,所以?
在这两个地方都可以。
推荐阅读
- regex - 正则表达式:捕获两个字符串之间的所有内容,除了那些字符串
- c# - 在 StackPanel 中按比例拉伸子项
- python - 使用protobuf编译时是否可以循环,将.proto文件转换为.py文件?
- c - 如何在 C 中的矩阵(二维数组)内声明双精度数?
- javascript - 如何从描述性对象动态生成类?
- function - Racket 中的“过程”和“功能”是同义词吗?
- git - 是否`
/ 这个 `git checkout` 命令中的` 代表远程分支还是远程跟踪分支? - python - What is the Keras 2.0 equivalent of `similarity = keras.layers.merge([target, context], mode='cos', dot_axes=0)`
- tensorflow - TensorFlow 损失的初始跳跃
- javascript - 如何创建精灵图像按钮并将其添加到 3D 画布?