首页 > 解决方案 > 使用 IN 条件选择行并分组

问题描述

我有下表,其中存储了建议 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 组合。

例如:

甚至可以通过这种方式查询suggest_id,还是我必须重新设计我的表?(我正在使用 PostgreSQL 数据库)

INPUT: (12, 14) 或 (14, 12) id 的顺序可能会改变

select suggestion_id from table WHERE goal_id IN(12, 14) group by suggestion_id

查询返回以下 id:1,1,4

标签: sqlpostgresqlgroup-by

解决方案


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


推荐阅读