左连接查询SUM统计结果错误,请求修正方案
嗨,我来帮你搞定这个LEFT JOIN后SUM统计出错的问题~
首先咱们得搞清楚问题出在哪:
- 你的原查询里,如果
contest_participants存在同一个wallpaper_id多条记录的情况,LEFT JOIN之后会把contest_wallpaper_upvote里的对应点赞数据重复匹配,导致SUM的时候把点赞数多算好几倍; - 另外,当某个
wallpaper_id在点赞表里没有记录时,sum(u.upvotes)会返回NULL,而不是你预期的0,这也会让统计结果看起来“错误”。
给你两个修正后的查询方案,都是靠谱的:
方案一:先聚合点赞表,再关联去重的参赛表
这是最稳妥的方式,先把点赞数据按wallpaper_id统计好,再和参赛表中去重后的wallpaper_id做关联:
SELECT p.wallpaper_id, COALESCE(u.total_upvotes, 0) AS total_upvotes FROM ( -- 先取出参赛表中唯一的wallpaper_id,避免重复关联 SELECT DISTINCT wallpaper_id FROM contest_participants WHERE contest_id = 2 ) p LEFT JOIN ( -- 先统计每个wallpaper的总点赞数 SELECT wallpaper_id, SUM(upvotes) AS total_upvotes FROM contest_wallpaper_upvote WHERE contest_id = 2 GROUP BY wallpaper_id ) u ON p.wallpaper_id = u.wallpaper_id
方案二:用子查询直接获取单条wallpaper的点赞数
如果你的contest_participants里wallpaper_id不会重复(或者你不想用子查询关联),也可以直接在SELECT里用子查询统计点赞数:
SELECT DISTINCT p.wallpaper_id, COALESCE( (SELECT SUM(upvotes) FROM contest_wallpaper_upvote u WHERE u.wallpaper_id = p.wallpaper_id AND u.contest_id = 2), 0 ) AS total_upvotes FROM contest_participants p WHERE p.contest_id = 2
这两个方案都解决了两个核心问题:
- 避免了重复统计点赞数的情况;
- 用
COALESCE把NULL转换成0,让没有点赞的作品也能显示正确的0值。
内容的提问来源于stack exchange,提问作者Deep Shah
相关产品推荐
相关产品推荐

