2016-01-23 74 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