mySQL:在引用相同外键的表中的多个列上应用 count()

问题描述 投票:0回答:1

我正在尝试获取每周热门歌曲列表中音乐流派的组计数,其中广告牌热门歌曲的表有多个外键,所有外键都指向歌曲的主键

song_id

例如:过去 4 周,10 首摇滚歌曲、12 首流行歌曲、2 首乡村歌曲等出现在每周排行榜歌曲排行榜上。

song
表: |歌曲 ID |歌曲名称 |类型 | | -------- | -------- | ------| | 1 | ab |流行 | | 2 |光盘|摇滚| | 3 | EF |说唱 | | ... | ... | ... |

weekly_top_chart
表:

bboard_id 歌曲1_id song2_id song3_id
1 2 4 6
2 8 12 4
... .... ... ...

我尝试在每个

UNION
列的
INNER JOIN
语句上使用
song#_id
song_id

SELECT count(s1.genre) AS gcnt 
FROM weekly_top_chart wtc 
INNER JOIN song s1 ON wtc.song1_id = s1.song_id
GROUP BY s1.genre
UNION
SELECT count(s2.genre) AS gcnt 
FROM weekly_top_chart wtc 
INNER JOIN song s2 ON wtc.song2_id = s2.song_id
GROUP BY s2.genre;

然而我得到的结果很简单:

gcnt
2
1

我也尝试过链接

INNER JOIN
但后来我无法获得所有列的总计

SELECT s1.genre, count(s1.genre), s2.genre, count(s2.genre)
FROM musicdb.weekly_top_chart wtc 
INNER JOIN musicdb.song s1 ON wtc.song1_id = s1.song_id
INNER JOIN musicdb.song s2 ON wtc.song2_id = s2.song_id
GROUP BY s1.genre, s2.genre;
mysql join foreign-keys union
1个回答
0
投票

您可以通过使用 UNION 或 UNION ALL 运算符来实现此目的,但您需要确保为每个计数使用正确的列别名。另外,如果您想包含重复的流派计数,您可能需要使用 UNION ALL 而不是 UNION。

SELECT genre, COUNT(*) AS gcnt
FROM (
    SELECT s1.genre
    FROM weekly_top_chart wtc
    INNER JOIN song s1 ON wtc.song1_id = s1.song_id
    
    UNION ALL
    
    SELECT s2.genre
    FROM weekly_top_chart wtc
    INNER JOIN song s2 ON wtc.song2_id = s2.song_id
    
    UNION ALL
    
    SELECT s3.genre
    FROM weekly_top_chart wtc
    INNER JOIN song s3 ON wtc.song3_id = s3.song_id
) AS subquery
GROUP BY genre;

您想要获取所有列的总计数而不区分流派来自哪一列,您可以简化查询:

SELECT genre, COUNT(*) AS gcnt
FROM (
    SELECT s.genre
    FROM weekly_top_chart wtc
    INNER JOIN song s ON wtc.song1_id = s.song_id
    
    UNION ALL
    
    SELECT s.genre
    FROM weekly_top_chart wtc
    INNER JOIN song s ON wtc.song2_id = s.song_id
    
    UNION ALL
    
    SELECT s.genre
    FROM weekly_top_chart wtc
    INNER JOIN song s ON wtc.song3_id = s.song_id
) AS subquery
GROUP BY genre;
© www.soinside.com 2019 - 2024. All rights reserved.