我正在尝试构建一个 MySQL 查询,该查询将允许我在数据库中提取具有流行和电子风格的轨道的歌曲名称。
+----------------------------------------------------+
TABLE: SONG
+----------------------------------------------------+
song_id | title |
1 | song name |
+----------------------------------------------------+
TABLE: GENRE
+----------------------------------------------------+
genre_id | name |
1 | Pop |
2 | Electronic |
+----------------------------------------------------+
TABLE: SONG_GENRE
+----------------------------------------------------+
genre_id | song_id |
1 | 1 |
2 | 1 |
此 SQL 不起作用,因为它显然永远不会同时返回 genre_id 1 和 2,但这就是我遇到的问题。
SELECT DISTINCT song.song_id, song.title
FROM song
LEFT JOIN song_genre ON song_genre.song_id = song.song_id
LEFT JOIN genre ON genre.genre_id = song_genre.genre_id
WHERE genre.genre_id ='1'
AND genre.genre_id='2'
如果有人能指出正确的方向,我将不胜感激!
最佳答案
这是一种方法:
SELECT DISTINCT song.song_id, song.title
FROM song
INNER JOIN (SELECT songid FROM song_genre WHERE song_genre.genre_id ='1') genre1
ON genre1.song_id = song.song_id
INNER JOIN (SELECT songid FROM song_genre WHERE song_genre.genre_id ='2') genre2
ON genre2.song_id = song.song_id
另一种可能更有效的方法。这假设 song_genre 中没有重复项。 COUNT(*) = X 其中 X 等于列出的流派数量。
SELECT DISTINCT song.song_id, song.title
FROM song
INNER JOIN (SELECT songid, COUNT(*) FROM song_genre
WHERE genre_id IN ('1','2')
GROUP BY songid HAVING COUNT(*) = 2) genre1 ON genre1.song_id = song.song_id
关于mysql - 规范化数据库 - 从一个到多个 - 搜索所有连接的数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9592038/