0

我有一个包含这样数据的表:

+---------+---------+
| user_id | item_id |
+---------+---------+
|     125 |     375 |
|     125 |       2 |
|     125 |      12 |
|     125 |     375 |
|     283 |       2 |
|     283 |      11 |
|     118 |     375 |
|     118 |      12 |
+---------+---------+

我正在尝试创建一个查询,该查询将返回拥有所有请求项目的所有用户,在这种情况下,请求的项目是:

item_id IN (375, 12) 

所以这应该是结果:

+---------+
| user_id |
+---------+
|     125 |
|     118 |
+---------+

没有将表连接到自身,我不确定我将如何完成此操作。我想到的一个想法是将其分组:user_id, item_id然后可能对其进行计数,但这会将双重记录计user_id: 125, item_id: 375为 2,将 user_id 125 的总计数为 3,这有它自己的一组问题,例如返回两次拥有相同项目的用户与我真正需要的用户,即拥有两个请求项目的用户。

4

1 回答 1

1

您可以使用HAVING COUNT(DISTINCT item_id) = 2,但我喜欢更明确一点——以下方法允许使用任意布尔逻辑:

SELECT   user_id
FROM     my_table
WHERE    item_id IN (375, 12)
GROUP BY user_id
HAVING   SUM(item_id = 375) AND SUM(item_id = 12)

sqlfiddle上查看。

这在 MySQL 中有效,因为它没有真正的布尔类型;相反,比较的“布尔”结果实际上是一个整数——1如果为真,0如果为假——因此,如果未找到匹配项,则组上的总和为零,否则为非零:这些术语可以与逻辑运算符组合,因为MySQL 的隐式类型转换回“布尔”类型。在其他 RDBMS 中,可能必须使用CASE

HAVING   SUM(CASE WHEN item_id = 375 THEN 1 ELSE 0 END) > 0
     AND SUM(CASE WHEN item_id =  12 THEN 1 ELSE 0 END) > 0
于 2012-12-13T23:18:43.310 回答