我有一个songs
表,一个lyrics
表和一个tags
表。一首歌可能有多个歌词(或没有),每个歌词只有一个标签。因此,在lyrics
表中,我有两个外键song_id
和tag_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
的工作原理并不正常。
答案 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