2016-01-23 33 views
1

我有songs表,lyrics表和tags表。一首歌曲可能有多個歌詞(或沒有),每個歌詞只有一個標籤。所以,在lyrics表中我有兩個外鍵,song_idtag_id,它們都鏈接到相應表中的記錄。SQL group by並只保留那些包含給定值的列的組

我想選擇所有歌曲,不要給出標記。例如,給出下面的視圖(這三個表INNER JOIN ED):

song_id | lyric_id | tag_id | tag_value 
--------------------------------------- 
1  | 1  | 1  | 'pop' 
1  | 2  | 2  | 'hip-hop' 
2  | 3  | 1  | 'pop' 
給出「嘻哈」標籤

,我需要檢索的第二首歌,因爲它具有鏈接沒有鏈接歌詞標籤與'嘻哈'值。

如果我給出'pop'標籤,則不會檢索到任何歌曲,因爲這兩首歌都有一個歌詞,其中包含'pop'標籤。

如何以最佳方式構建這樣的查詢?我正在考慮按song_id分組,然後做HAVING(tag_value != 'hip-hop'),但不幸的是這不是HAVING的工作原理。

回答

3

這是[not] exists操作一個經典的用例:

SELECT * 
FROM songs s 
WHERE NOT EXISTS (SELECT * 
        FROM lyrics l 
        JOIN tags t ON l.tag_id = t.id 
        WHERE l.song_id = s.id AND 
          t.tag_value = 'hip-hop') -- or any other tag