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
相关产品推荐
相关产品推荐

