2012-11-08 59 views
2

我很感謝任何幫助創建此查詢。我嘗試了幾種方法,但沒有運氣。由於我的問題對我來說有點困難,我會舉一個我想做的事情的簡單例子。我有一個在結構上類似於下面的數據:Mysql查詢找到一個列滿足多個條件的ID

ID TYPE COLOR 
1 A  Blue 
1 B  Red 
1 C  Green 
2 C  Blue 
2 B  Green 

我想,如果我有兩個特定顏色的ID來創建一個查詢返回的類型。例如,我想找到所有同時具有藍色和紅色的ID。該查詢然後將返回:

1, A , B 

A和B返回的順序並不重要。數據集很大,我預計很多ID都可以匹配這兩個條件(大約5萬個左右)。我應該注意,這種類型與顏色無關,因此使問題與this other stackoverflow question,as well as this one不同。

我想我需要做一些子查詢。但真的不知道該怎麼做,謝謝。

+0

如果您需要提出未來的問題,將示例數據和結構放在一起總是一個好主意! – Laurence

回答

5
SELECT ID, TYPE FROM types NATURAL JOIN (
    SELECT ID FROM types GROUP BY ID HAVING SUM(COLOR='Red') AND SUM(COLOR='Blue') 
) t WHERE COLOR IN ('Red', 'Blue') 

請參閱sqlfiddle

另外,如果你很高興有連接成一個分隔字符串類型,你可以在一個單次提取所需的數據:

SELECT ID, GROUP_CONCAT(TYPE) 
FROM  types 
WHERE COLOR IN ('Red', 'Blue') 
GROUP BY ID 
HAVING COUNT(*) = 2 

看到它的sqlfiddle

請注意,如果您的表可能包含具有相同(ID, COLOR)對的多個記錄,那麼應該用替代COUNT(*)

+0

你可以在MySQL中對布爾表達式('color ='Red'')進行求和?這是如何定義的?我的意思是,總結三個「假」和兩個「真」值的結果是什麼? –

+0

@a_horse_with_no_name:布爾表達式的計算結果爲1,如果爲true,則返回0;否則返回0。因此,如果沒有組員匹配,則得出總和爲零,如果至少有一名成員匹配,則總和爲非零;使用'HAVING'子句中的結果再次轉換回布爾值。在你的例子中,結果是'0 + 0 + 0 + 1 + 1 = 2'。 – eggyal

+0

所以MySQL沒有「真正的」布爾值? (因爲'0'和'1'是**不是**布爾值)。 –

相關問題