mysql - 规范化数据库 - 从一个到多个 - 搜索所有连接的数据集

标签 mysql sql relational-database normalization

我正在尝试构建一个 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/

相关文章:

mysql - 我需要有关数据库中规范化表的帮助

mysql - 不存在 - SQL 查询

mysql - 合并 SQL 中同一列的行

以 varchar 列作为外键的 MySQL 表

mysql - 使用 SELECT 有条件地填充列

mysql - 如何根据另一个表的值使用 MySQL 选择一个值?

PHP、MySQL、空间数据和设计

postgresql - 在 SQL 中的条目之间表达选择

MySQL复杂连接-无法选择第二个表中的多个列

sql - 如何从查询中获取值到变量