如何编写MySQL查询获取每位艺术家专辑的平均曲目数
解决方案:计算每位艺术家的专辑平均曲目数
要得到每位艺术家的专辑平均曲目数,我们需要先算出每张专辑的曲目总量,再对该艺术家所有专辑的曲目数取平均值。这里是完整的SQL查询语句,我会一步步拆解逻辑:
核心逻辑拆解
- 第一步:先统计每张专辑的曲目数量,用子查询来实现,避免重复计算
- 第二步:通过
artist_album关联表,把专辑和对应的艺术家绑定 - 第三步:按艺术家分组,计算该艺术家所有专辑曲目数的平均值
完整SQL查询语句
SELECT a.name AS artist_name, ROUND(AVG(album_track_count.track_count), 2) AS average_tracks_per_album FROM artist a LEFT JOIN artist_album aa ON a.id = aa.artist_id LEFT JOIN ( -- 子查询:计算每张专辑的曲目数量 SELECT album_id, COUNT(track_title) AS track_count FROM track GROUP BY album_id ) album_track_count ON aa.album_id = album_track_count.album_id GROUP BY a.id, a.name ORDER BY average_tracks_per_album DESC;
关键细节说明
- 使用
LEFT JOIN而非INNER JOIN:这样可以保留那些没有任何专辑或曲目的艺术家,他们的平均曲目数会显示为NULL,如果需要显示为0,可以用COALESCE(ROUND(AVG(...), 2), 0)替代 ROUND(..., 2):把平均值保留两位小数,让结果更易读,你可以根据需求调整小数位数- 分组时同时用
a.id和a.name:避免出现同名艺术家被错误合并的情况(如果数据库里存在同名不同ID的艺术家) - 子查询分组:确保每张专辑只计算一次曲目数,避免因多表JOIN导致的重复计数问题
简化版本(仅统计有专辑的艺术家)
如果只需要统计拥有专辑的艺术家,可以把LEFT JOIN换成INNER JOIN:
SELECT a.name AS artist_name, ROUND(AVG(album_track_count.track_count), 2) AS average_tracks_per_album FROM artist a JOIN artist_album aa ON a.id = aa.artist_id JOIN ( SELECT album_id, COUNT(track_title) AS track_count FROM track GROUP BY album_id ) album_track_count ON aa.album_id = album_track_count.album_id GROUP BY a.id, a.name ORDER BY average_tracks_per_album DESC;
内容的提问来源于stack exchange,提问作者yushi
相关产品推荐
相关产品推荐

