我正在尝试构建一个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
假设数据是标准化的,并且字符与示例中的相同:
SELECT
song.song_id,
song.title
FROM
song
INNER JOIN song_genre ON song_genre.song_id = song.song_id
INNER JOIN genre ON genre.genre_id= song_genre.genre_id
WHERE
genre.genre_id in ('1', '2')
根据您的意见修改:
SELECT
song.song_id,
song.title
FROM
song
INNER JOIN song_genre ON song_genre.song_id = song.song_id
INNER JOIN genre g1 ON g1.genre_id = song_genre.genre_id
INNER JOIN genre g2 ON g2.genre_id = song_genre.genre_id
WHERE
g1.genre_id = '1' and
g2.genre_id = '2'
WHERE genre.genre_id ='1'
AND genre.genre_id='2'
你的问题对吗?
如果,那么这意味着在这两种情况下都必须为true,但是每行只有一个genre_id!也许用"OR"或。。。genre.genre_id IN(1,2)