You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:22:26