我正在开发一个启用了intarray扩展的 Postgres 9.4项目。我们有一个如下所示的表:
items
-------------------------------------
id name tag_ids
--------------------------------------
1 a car {1,4}
2 a room to rent {1}
3 a boat {1,2,4,11}
4 a wine {2}
5 emily {3}
如果可能的话,我想对标签 ID 进行分组。就像计算所有具有tag_id
'{1,2,4,11}'的元素
tag_id count
1 3
2 2
4 2
11 1
这可能吗?我会认为这样的交叉点:
select * from items where tag_ids && '{1,2,4,11}'
但我需要按交集结果内的数组元素进行分组。如果我按 tag_ids 分组,它只是唯一值。
我该怎么做?
保留您已经必须使用索引廉价地识别具有任何重叠数组元素的行的基本查询。
然后只取消连接中的交集 (
tag_ids & '{1,2,4,11}'
)LATERAL
。最后,汇总:再一次,intarray 模块的交集算子
&
是有帮助的。上一个相关答案:
没有数组
如果您没有安装 intarray,或者对于任何其他数组类型,我们需要另一个连接:
细微的区别:交集运算符折叠重复项以产生不同的元素,而此查询没有。仅当存在重复的数组元素时才重要...
小提琴演示了两个查询都在一个表上运行,其中一个额外的行混合了匹配和不匹配的元素,以显示需要交集或额外的连接来消除不需要的元素:
db<>fiddle here
旧sqlfiddle