如何在SQL中计算每名用户发布照片数的平均值,解决组函数调用报错
报错原因
你遇到的ERROR 1111 (HY000): Invalid use of group function报错核心原因是不支持在同一查询层级直接嵌套聚合函数,AVG(count(*))属于非法写法:COUNT(*)是按user_id分组后的聚合结果,无法在同一层SELECT语句中再对这个结果做AVG聚合计算。
正确实现方案
方案1:仅计算所有用户的平均发布照片数量
如果你只需要得到最终的平均值,不需要同步展示每个用户的发布数量,可以先通过子查询统计每个用户的发布数,外层再对这组统计值求平均:
SELECT AVG(user_photo_count) AS average_photos_per_user FROM ( SELECT COUNT(*) AS user_photo_count FROM photos GROUP BY user_id ) AS user_counts;
方案2:同时展示每个用户的发布数量和整体平均值
如果你需要在结果里同时看到每个用户的user_id、对应发布数、以及整体平均值,可以通过交叉联接把提前计算好的平均值拼接到每一行:
SELECT p.user_id, COUNT(*) AS total, avg_result.average_photos_per_user FROM photos p CROSS JOIN ( SELECT AVG(user_photo_count) AS average_photos_per_user FROM ( SELECT COUNT(*) AS user_photo_count FROM photos GROUP BY user_id ) AS user_counts ) AS avg_result GROUP BY p.user_id, avg_result.average_photos_per_user;
版本适配说明
如果你使用的是MySQL 8.0及以上版本,也可以用窗口函数实现方案2的需求,写法更简洁:
SELECT user_id, COUNT(*) AS total, AVG(COUNT(*)) OVER () AS average_photos_per_user FROM photos GROUP BY user_id;
窗口函数允许聚合函数嵌套使用,因为窗口计算是在GROUP BY聚合之后执行的,不会触发层级冲突。
内容的提问来源于stack exchange,提问作者Yitong Li
相关产品推荐
相关产品推荐

