SQL group by并仅保留包含列的给定值的组
我有一张SQL group by并仅保留包含列的给定值的组,sql,select,group-by,having,Sql,Select,Group By,Having,我有一张歌曲表,一张歌词表和一张标签表。一首歌可能有多首歌词(或没有),而每首歌词只有一个标签。因此,在歌词表中,我有两个外键,song\u id和tag\u id,它们都链接到相应表中的记录 我想选择所有没有给定标记的歌曲。例如,给定以下视图(三个表是internaljoined): 给定“hip-hop”标签,我需要检索第二首歌曲,因为它没有链接的歌词,而链接的标签具有“hip-hop”值 如果我给“pop”标签,就不会检索到任何歌曲,因为这两首歌都有一首歌词链接了“pop”标签 如何以最佳
歌曲
表,一张歌词
表和一张标签
表。一首歌可能有多首歌词(或没有),而每首歌词只有一个标签。因此,在歌词
表中,我有两个外键,song\u id
和tag\u id
,它们都链接到相应表中的记录
我想选择所有没有给定标记的歌曲。例如,给定以下视图(三个表是internaljoin
ed):
给定“hip-hop”标签,我需要检索第二首歌曲,因为它没有链接的歌词,而链接的标签具有“hip-hop”值
如果我给“pop”标签,就不会检索到任何歌曲,因为这两首歌都有一首歌词链接了“pop”标签
如何以最佳方式构建这样的查询?我想按
song\u id
进行分组,然后做have(tag\u value!=“hip-hop”)
,但不幸的是have
不是这样工作的。这是[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
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