2012-09-07 98 views
2

在我的MySQL數據庫中,我有兩列設置像這樣(例如):MySQL的多行SELECT查詢

series_id category_id 
    1   1 
    1   2 
    1   3 
    2   1 
    2   3 
    3   2 
    4   1 
    4   2 

什麼是正確的選擇查詢我可以用它來選擇series_id當category_id = 1和2?

當前的查詢是這樣的:

SELECT series_id 
FROM table 
WHERE category_id = '1' 
OR category_id = '2' 
GROUP BY series_id" 

,因爲這樣的:

SELECT series_id 
FROM table 
WHERE category_id = '1' 
AND category_id = '2' 
GROUP BY series_id 

不檢索任何結果

在關於這個例子,我想它返回兩行,其中series_id是1和2,所以結果如下所示:

series_id 
    1 
    4 

(可選/獎金)如果有可能想出另一種解決方案或利用:

GROUP_CONCAT(category_id SEPARATOR ', ') AS category 

用於從該查詢返回的series_id(一個或多個),以使返回的結果是:

series_id category 
    1  1, 2, 3 
    4  1, 2 

這將非常感激。感謝您抽出寶貴的時間幫助解決這一具有挑戰性的問題。

回答

4
SELECT series_id 
FROM  my_table 
WHERE category_id IN (1,2) 
GROUP BY series_id 
HAVING COUNT(*) = 2 

請參閱sqlfiddle

注意,如果(series_id, category_id)不能保證是唯一的,你應該用較少的高性能COUNT(DISTINCT category_id)更換COUNT(*)

要返回的分組結果,可以再次加入對你的表:

SELECT series_id, GROUP_CONCAT(category_id) 
FROM my_table NATURAL JOIN (
    SELECT series_id 
    FROM  my_table 
    WHERE category_id IN (1,2) 
    GROUP BY series_id 
    HAVING COUNT(*) = 2 
) t 
GROUP BY series_id 

看到它的sqlfiddle

+0

我測試您所提供的解決方案,它精美的作品。關於相同的示例mysql數據庫表,我還有一個相關的問題。如果你想檢索WHERE category_id <>'1'和category_id <>'3'的結果,你會怎麼做,因此在這個例子中唯一返回的結果是series_id = 3時的結果? –

+0

@RichVRed:你正在尋找一個反連接。在MySQL中,[兩個性能最高的方法](http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/)通過一個帶'NULL'測試的外連接(類似於我上面的回答)或者通過'NOT IN'(類似於[Jon Woo的回答](http://stackoverflow.com/a/12318244/623041))。在[sqlfiddle](http://sqlfiddle.com/#!2/07bde/14)上查看它們。 – eggyal

+0

非常感謝! –

2

您需要有SubQuery才能獲得series_id,以便稍後您可以使用GROUP_CONCAT。

SELECT series_ID, GROUP_CONCAT(category_id) 
FROM tableName 
WHERE series_ID IN 
     (
      SELECT series_id 
      FROM tableName 
      WHERE Category_ID IN (1,2) 
      GROUP BY seriesID 
      HAVING COUNT(series_id) = 2 
     ) 
GROUP BY series_ID 

SQLFiddle Demo

希望這有助於你。

enter image description here

+0

'COUNT(series_id)'可能不如'COUNT(*)',並且在這種情況下,保證返回相同的結果(因爲分組操作,該列不能爲NULL)。 – eggyal