2012-09-27 34 views
0

我需要GROUP BY item_id並檢查是否有user_id中的任何一個匹配變量。如果是的話,我希望它= 1,如果不是0如何在SQL中GROUP BY,然後標記爲0,

例如,假設表是這樣的:

item_id, user_id 
1   1 
1   3 
2   4 
2   1 
2   7 
2   3 
3   4 
3   6 
4   8 
4   1 
5   3 


IF (user_id = 3,1,0) AS match, 

希望我的查詢回來的

item_id, match 
1  1 
2  1 
3  0 
4  0 
5  1 

其中「1 「item_id組中的所有user_id 3。

回答

5

您需要正確的聚合函數:

select item_id, 
     max(case when user_id = 3 then 1 else 0 end) as hasmatch 
from t 
group by item_id 
order by item_id 
+0

'什麼時候有事1 then else end 0'='something' – AndreKR

+0

@AndreKR。 。 。所有數據庫中的簡化都不是這樣。我的答案中的語法是ANSI標準,幾乎可以想象任何數據庫的支持。 –

+0

好吧,快速查看規格沒有拿出相反的證據,爲了安全起見,我編輯了我的答案。 – AndreKR

0

如下我會做到這一點:

SELECT 
    A.item_id, ISNULL(B.count, 0) 
FROM 
    (SELECT DISTINCT item_id 'item_id' FROM myTable) AS A 
    LEFT JOIN 
     (
      SELECT item_id, count(*) 'count' 
      FROM myTable WHERE user_id IN (3, 1, 0) 
      GROUP BY item_id 
     ) AS B 
    ON A.item_id = B.item_id 
1

MySQL的真正爲1和是0,所以你可以這樣做:

SELECT item_id, MAX(user_id = 3) AS has_match 
FROM table 
GROUP BY 1 

你甚至可以計算匹配的數量:

SELECT item_id, SUM(user_id = 3) AS matches 
FROM table 
GROUP BY 1 

GROUP BY 1是短期的GROUP BY item_id,爲item_id是第一選擇表達。

+1

。 。你應該熟悉SQLFiddle(www.sqlfiddle.com)。您可以嘗試在不同的數據庫上查詢。 'SUM'/'MAX'語法在Oracle,SQL Server或Postgres上不起作用。 「GROUP BY 1」語法也不是標準的。據我所知,* true *和* false *不是由標準定義的,並且在大多數數據庫中沒有定義。 –

+0

不錯的工具。 :)再次編輯。 – AndreKR

+0

@AndreKR最上面的一個幾乎符合我的需求。我可以跟這個去。很簡單。將嘗試實施並將回來。 – KickingLettuce