2012-12-13 54 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 
相關問題