LEFT JOIN关联多表查询时sum求和结果不正确问题求解
问题分析与解决方法
错误根源
计算偏差是左连接产生笛卡尔积重复计数导致的:当teams_users中同一个团队存在N个用户,summary_coins中同一个团队存在M条金币记录时,左连接后会生成N*M条关联数据,此时对get_count求和会把每条金币记录重复计算N次。你遇到的team_id=3总用户10、实际总金币30的场景,求和结果就是30 * 10 = 300,和反馈的错误结果完全吻合。
解决方案
先分别对两张表按team_id分组聚合得到单团队维度的统计结果,再做关联即可避免重复计数:
SELECT t.team_id, t.total_user, IFNULL(c.total_get_count, 0) AS get_count FROM -- 先统计每个团队的总用户数 (SELECT team_id, COUNT(user_id) AS total_user FROM teams_users GROUP BY team_id) t LEFT JOIN -- 再统计每个团队的总金币数 (SELECT team_id, SUM(get_count) AS total_get_count FROM summary_coins GROUP BY team_id) c ON t.team_id = c.team_id ORDER BY get_count DESC, team_id ASC
效果验证
用你提供的样例数据执行上述SQL,输出结果完全符合预期:
| team_id | total_user | get_count |
|---|---|---|
| 2 | 1 | 15 |
| 1 | 2 | 0 |
内容的提问来源于stack exchange,提问作者Niloy Rony
相关产品推荐
相关产品推荐

