我有这样的购买表:
+--------+--------+
| UserId | ItemId |
+--------+--------+
| 1 | 2 |
| 4 | 5 |
| 5 | 3 |
| 1 | 4 |
+--------+--------+
我想选择已购买商品的所有用户ID(4,5,6)。我正在尝试这个查询:
select distinct UserId from purchases where ItemId in (4,5,6)
这会返回购买了这3件商品中任意商品的用户,但我只想要购买了所有3件商品的用户。
对我能做什么的任何想法?我正在使用PostgreSQL 8。
答案 0 :(得分:3)
将count(*)
子句中的having
与集合中的项目数相匹配将返回已购买集合中所有项目的所有UserId
。
select UserId
from purchases
where ItemId in (4,5,6)
group by UserId
having count(distinct ItemId) = 3 /* 3 is the number of items to match the set */
如果给定的UserId
和ItemId
可以有多行,那么您可以使用count(distinct ItemId)
代替。
rextester演示:http://rextester.com/QXL12068
答案 1 :(得分:0)
select userId
from purchase
group by userId
having
bool_or (itemId = 4) and
bool_or (itemId = 5) and
bool_or (itemId = 6)