我正在尝试获取每周热门歌曲列表中音乐流派的组计数,其中广告牌热门歌曲的表有多个外键,所有外键都指向歌曲的主键
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;
您可以通过使用 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;