多表关联场景下使用SQL SUM函数统计歌手音乐总时长问题求助
问题排查与可行SQL方案
原代码错误点
- 聚合函数语法错误:
SUM(Music Duration)(*)写法完全不符合SQL规范,带空格的字段名需要用反引号包裹,求和直接写SUM(c.Music Duration)即可 - 分组逻辑错误:需求是按艺术家统计总时长,GROUP BY 字段错误选了音乐时长,且加了多余的表别名前缀
c. - 关联写法不规范:隐式逗号连接容易漏写关联条件,推荐用显式JOIN语法可读性更高
- 缺艺术家维度字段:SELECT 子句没有返回艺术家标识/名称,统计结果无法对应到具体艺术家
可行解决方案
方案1:直接查询统计每位艺术家的音乐总时长
SELECT p.ID AS 艺术家ID, p.`Artist Name` AS 艺术家名称, -- 请替换为你表中实际的艺术家名字段名 SUM(c.`Music Duration`) AS 音乐总时长 FROM tbl_artist_list p INNER JOIN tbl_single_query p_c ON p.ID = p_c.Artist_ID INNER JOIN tbl_music_list c ON c.ID = p_c.Music_ID GROUP BY p.ID, p.`Artist Name` -- 非聚合字段都要放在GROUP BY中,兼容SQL_MODE严格模式
如果你的phpMyAdmin环境的数据库是MySQL 5.7+,需要确保GROUP BY后面包含所有SELECT里的非聚合字段,避免严格模式报错。
方案2:直接生成新的统计表
如果需要把结果持久化为新表,用以下语句,新表名可自行修改:
CREATE TABLE tbl_artist_music_total_duration SELECT p.ID AS 艺术家ID, p.`Artist Name` AS 艺术家名称, SUM(c.`Music Duration`) AS 音乐总时长 FROM tbl_artist_list p INNER JOIN tbl_single_query p_c ON p.ID = p_c.Artist_ID INNER JOIN tbl_music_list c ON c.ID = p_c.Music_ID GROUP BY p.ID, p.`Artist Name`;
注意:如果你的艺术家表中姓名字段不是
Artist Name,请替换为实际的字段名称即可正常运行。
内容的提问来源于stack exchange,提问作者johnfe
相关产品推荐
相关产品推荐

