使用 IN 条件选择行并分组
Posted
技术标签:
【中文标题】使用 IN 条件选择行并分组【英文标题】:Select rows using IN condition and group by 【发布时间】:2021-11-13 13:38:25 【问题描述】:我有下表,其中存储了建议 ID 和目标 ID
id|goal_id|suggestion_id
1 | 12| 1
2 | 13| 2
2 | 17| 2
3 | 14| 1
4 | 15| 3
5 | 16| 3
6 | 12| 4
6 | 18| 4
我想查询建议 ID 以获得特定的目标 ID 组合。
例如:
goal_id(13, 17) => 我需要建议 id: 2 goal_id(12, 14) => 我需要建议 id: 1 goal_id(14, 12) => 我需要建议 id: 1 goal_id(12, 18) => 我需要建议 id: 4是否可以通过这种方式查询suggest_id,或者我必须重新设计我的表? (我使用的是 PostgreSQL 数据库)
INPUT: (12, 14) or (14, 12) id的顺序可能会改变
select suggestion_id from table WHERE goal_id IN(12, 14) group by suggestion_id
查询返回以下id:1,1,4
【问题讨论】:
【参考方案1】:如果您想要子集匹配并且正在寻找 2 个(或 n
项目),Matt 的答案就有效。但是,如果您想要完整的匹配项,例如 12 和 14 而没有别的,那么我会建议对该方法进行更改。假设表没有重复:
select suggestion_id
from t
group by suggestion_id
having array_agg(goal_id order by goal_id) = array[12, 14];
请注意,使用数组可以轻松传入任意数量的值。您还可以调整它以使用数组进行子集匹配:
select suggestion_id
from t
where goal_id = any(array[12, 14])
group by suggestion_id
having array_agg(goal_id order by goal_id) = array[12, 14]
或者在这种情况下,您可以在having
子句中使用数组长度:
having count(*) = cardinality(array[12, 14])
【讨论】:
谢谢戈登·林诺夫!这正是我想要的。它运作良好,但我不明白为什么.. 例如这一行的目的是什么:“goal_id order by goal_id”【参考方案2】:WHERE
子句适用于单个行,而不是组。
IN
本质上是WHERE goal_id = 12 OR goal_id = 14
你需要的是第二个过滤器,上面写着but only groups which have Both of these
select suggestion_id
from table
where goal_id IN (12, 14)
group by suggestion_id
having count(distinct goal_id) = 2
HAVING
子句在聚合到组之后应用。所以,现在我们可以计算组中有多少不同的目标,并且只保留正好有 2 个不同目标的组。
distinct
以防一个suggestion_id
可以多次关联相同的goal_id
。
注意:如果您的 IN()
列表包含 2 个以上的项目,您还需要更新 = 2
。
【讨论】:
感谢 MatBailie 的回答!以上是关于使用 IN 条件选择行并分组的主要内容,如果未能解决你的问题,请参考以下文章