2012-12-13 53 views
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,它有它自己的一套问题如返回拥有同一项目两次对我真正需要的,这是一个既具有要求的项目的用户的用户。

回答

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如果为true,并且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 
相关问题