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

左连接查询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

这两个方案都解决了两个核心问题:

  1. 避免了重复统计点赞数的情况;
  2. 用COALESCE把NULL转换成0,让没有点赞的作品也能显示正确的0值。

内容的提问来源于stack exchange,提问作者Deep Shah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:37:01