SQL group by并仅保留包含列

时间:2016-01-23 08:12:27

标签: sql select group-by having

我有一个songs表,一个lyrics表和一个tags表。一首歌可能有多个歌词(或没有),每个歌词只有一个标签。因此,在lyrics表中,我有两个外键song_idtag_id,它们都链接到相应表中的记录。

我想选择 给定标记的所有歌曲。例如,给定以下视图(三个表格为INNER JOIN ed):

song_id | lyric_id | tag_id | tag_value
---------------------------------------
1       | 1        | 1      | 'pop'
1       | 2        | 2      | 'hip-hop'
2       | 3        | 1      | 'pop'
鉴于' hip-hop'标签,我需要检索第二首歌,因为它没有链接的歌词,链接标签与' hip-hop'值。

如果我要给出“流行音乐”。标签,不会检索任何歌曲,因为这两首歌都有一首歌词,其中包含“#pop;'标记链接。

如何以最佳方式构建此类查询?我考虑按song_id进行分组,然后进行HAVING(tag_value != 'hip-hop')分组,但遗憾的是HAVING的工作原理并不正常。

1 个答案:

答案 0 :(得分: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