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

MySQL Join结合Sum函数返回错误结果,求正确查询语句

解决重复关联导致的SUM重复计数问题

你遇到的问题很典型:当直接多次关联同一张表时,如果其中一个关联分支有多条匹配记录,主表的行就会被重复展开,最终SUM计算时会把单条记录的数值重复累加。比如你的例子里,table1_2有2条pid=345且from_id=10的记录,和table1那1条pid=345且to_id=10的记录关联后,table1.quantity=6会被显示2次,SUM后就变成了12,而不是预期的6。

正确的SQL查询方案

核心思路是先分别聚合每个pid对应的t1q和t2q,再进行关联,避免行被重复展开。这里提供两种可读性都很好的写法:

方案1:使用子查询预先聚合

SELECT 
    t1.t1q,
    t2.t2q,
    SUM(t3.quantity) AS t3q,
    t1.pid
FROM (
    -- 预先计算每个pid的t1q(to_id=10的quantity总和)
    SELECT pid, SUM(quantity) AS t1q
    FROM table1
    WHERE to_id = 10
    GROUP BY pid
) t1
INNER JOIN (
    -- 预先计算每个pid的t2q(from_id=10的quantity总和)
    SELECT pid, SUM(quantity) AS t2q
    FROM table1
    WHERE from_id = 10
    GROUP BY pid
) t2 ON t1.pid = t2.pid
INNER JOIN table3 t3 ON t1.pid = t3.pid
WHERE t3.some_id = 10
GROUP BY t1.pid, t1.t1q, t2.t2q;

方案2:使用CTE(公共表表达式),可读性更强

WITH t1_agg AS (
    SELECT pid, SUM(quantity) AS t1q
    FROM table1
    WHERE to_id = 10
    GROUP BY pid
),
t2_agg AS (
    SELECT pid, SUM(quantity) AS t2q
    FROM table1
    WHERE from_id = 10
    GROUP BY pid
)
SELECT 
    t1.t1q,
    t2.t2q,
    SUM(t3.quantity) AS t3q,
    t1.pid
FROM t1_agg t1
INNER JOIN t2_agg t2 ON t1.pid = t2.pid
INNER JOIN table3 t3 ON t1.pid = t3.pid
WHERE t3.some_id = 10
GROUP BY t1.pid, t1.t1q, t2.t2q;

方案说明

  • 两个子查询/CTE分别对table1按pid聚合,得到每个pid对应的t1q和t2q,每个pid只会返回一行结果。
  • 之后再和table3关联时,不会出现行重复展开的情况,SUM(t3.quantity)也能准确计算对应pid的总和。
  • 用你的示例数据测试:t1q会得到6,t2q得到4+3=7,完全符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:07:27