mysql 使用left join 连接两个表使用sum计算时结果翻倍的问题
遇到这个问题真实无语,它也不算报错,运行看没有问题也就没管,出来总结果时发现不对了,数据对不上,关键这个语句还是对的,排查起来就很无语。我就是第二个原因,解决方法是在连接之前,先对多表中的数据进行聚合,将数据存放在临时表中,再联合临时表进行查询。我有两个表,订单表orders,入库表 goods_in_stock,里面都有 货物名称、数量。订单表orders 硅矿1的值只有60才对啊,他直接变成了
·
遇到这个问题真实无语,它也不算报错,运行看没有问题也就没管,出来总结果时发现不对了,数据对不上,关键这个语句还是对的,排查起来就很无语。
先介绍下问题:
我有两个表,订单表orders,入库表 goods_in_stock,里面都有 货物名称、数量。想要计算剩下的库存。


正常思维就是连接两个表,然后用sum计算对吧,像这样
SELECT a.goods_name , sum(a.in_quantity), sum(b.order_quantity), (sum(a.in_quantity)-sum(b.order_quantity)) quantity FROM goods_in_stock a
left join orders b
on a.goods_name = b.goods_name
GROUP BY goods_name;
但是结果很明显不对啊。订单表orders 硅矿1的值只有60才对啊,他直接变成了3倍的180....

关键是他还不算错,坑爹啊!!
原因:
最后研究了一下,发现了可能存在这个问题的原因
- 连接条件不正确:确保连接条件准确匹配了两个表中的相关记录。如果连接条件不正确,可能会导致一个表中的记录与另一个表中的多条记录匹配,从而在求和时出现重复计算。
- 存在一对多关系:如果两个表之间存在一对多关系,即一个表中的一条记录与另一个表中的多条记录相关联,那么在使用
LEFT JOIN和SUM时可能会出现结果翻倍的情况。
我就是第二个原因,解决方法是在连接之前,先对多表中的数据进行聚合,将数据存放在临时表中,再联合临时表进行查询。具体如下:
解决办法
先把这两个表处理一下,放在临时表里
CREATE TEMPORARY TABLE temp_goods_in_stock
SELECT goods_name, SUM(in_quantity) AS total_in_quantity
FROM goods_in_stock
GROUP BY goods_name;
CREATE TEMPORARY TABLE temp_orders
SELECT goods_name, SUM(order_quantity) AS total_order_quantity
FROM orders
GROUP BY goods_name;
在进行联合查询
select * from temp_goods_in_stock;
select * from temp_orders
SELECT t1.goods_name, (t1.total_in_quantity - t2.total_order_quantity) end_quanitity
FROM temp_goods_in_stock t1
LEFT JOIN temp_orders t2 ON t1.goods_name = t2.goods_name;
这样结果就对了

更多推荐
所有评论(0)