连接和SUM()的麻烦

时间:2016-10-03 12:03:47

标签: mysql

我在检索订单数量减去收到的数量时遇到了问题。

表的基本版本看起来像

order_main 
id | status
1  | 2
2  | 1
3  | 3
4  | 2

order_part
id | partid | quantity | status | order_main_id
1  | 12345  | 100      | 2      | 1
2  | 23456  | 20       | 3      | 1
3  | 555    | 15       | 1      | 2
4  | 666    | 10       | 3      | 3
5  | 12345  | 40       | 2      | 4


order_reception
id | order_main_id
1  | 2
2  | 2
3  | 2
4  | 3

order_reception_part
id | partid | quantity | order_reception_id
1  | 12345  | 40       | 1
2  | 23456  | 20       | 1
3  | 12345  | 10       | 2
4  | 12345  | 20       | 3
5  | 666    | 10       | 4

所以基本上我想知道partid 12345还有多少仍然延期。 结果应该看起来像

partid | in_order 
12345  | 70

(100 + 40) - (40 + 10 + 20)

我的尝试存在的问题是,当我尝试将订单数量相加时,每次接收时我得到3 * 100一个+ 40因为order_part没有直接链接到order_reception_part

额外信息状态1 =准备订购,状态2 =有序,3 =已收到

我希望我已经解释得很清楚,否则请向我询问其他信息。

以下查询将显示我的意思,我需要每个订单SUM() orp.quantity,但每次接收的结果都会显示100,但我只需要' 100'其他订单的1次+ 80次。

SELECT om.id, op.quantity, orp.quantity
FROM order_main om
JOIN order_part op ON om.id = op.order_main_id
LEFT JOIN order_reception `or` ON om.id = or.order_main_id
LEFT JOIN order_reception_part orp ON or.id = orp.order_reception_id
WHERE op.partid = 12345
AND op.status = 2

2 个答案:

答案 0 :(得分:0)

简单的解决方案是:

SELECT (
    SELECT SUM(quantity) 
    FROM order_part 
    WHERE order_part.partid=12345 - 
    SELECT SUM(quantity) 
    FROM order_reception_part 
    WHERE order_reception_part.partid=12345
);

答案 1 :(得分:0)

我自己找到了答案。使用连接获取正确的orp.quantity并使用子查询获取整个op.quantity,然后减去它们。

SELECT (
   SELECT SUM(quantity) 
   FROM order_part 
   WHERE partid = p.partid 
   AND `status` = 2
) - IFNULL(SUM(orp.quantity), 0)  

FROM order_main om
JOIN order_part op ON om.id = op.order_main_id
LEFT JOIN order_reception `or` ON om.id = or.order_main_id
LEFT JOIN order_reception_part orp ON or.id = orp.order_reception_id
AND orp.partid = op.partid
WHERE op.partid = p.partid
AND op.status = 2