我有以下MySQL数据库结构:
表sales_order - id,name,...
id | name
------------------
1 | Order Test
表sales_order_item - id,order_id,name,amount_dispatched ...
id | order_id | name | amount_dispatched
------------------------------------------
1 | 1 | Item 1 | 5
2 | 1 | Item 2 | 10
表sales_order_item_invoice - id,item_id,amount,...
id | item_id | amount
---------------------
1 | 1 | 3
2 | 2 | 5
3 | 2 | 5
这三个表通过外键链接。表"发票"可以在" item"中为一行添加更多行。表"项目"可以在" order"。
中为一行添加更多行现在,我需要创建SQL查询,返回表sales_order中的所有行,并在其中附加一些来自其他表的数据 - amount_dispatched和amount_invoiced:
已发送=所有订单项目的总和' amount_dispatched 发票=所有发票的总和'金额(如果没有发票,则为0)
这样的查询似乎很简单:
SELECT
`sales_order`.*,
SUM(`sales_order_item`.`amount_dispatched`) AS dispatched,
SUM(`sales_order_item_invoice`.`amount`) AS invoiced,
FROM `sales_order`
LEFT JOIN `sales_order_item` ON `sales_order`.`id` = `sales_order_item`.`order_id`
LEFT JOIN `sales_order_item_invoice` ON `sales_order_item`.`id` =`sales_order_item_invoice`.`item_id`
GROUP BY `sales_order`.`id`
结果包含所有订单 - 好的 结果包含发票金额总和 - 好的 " amount_dispatched"的结果无效 - 如果该项目在item_invoice中有更多行,则该项目的金额会被累加几次,因此对于上面的示例,我得到:
id | name | dispatched | invoiced
---------------------------------------
1 | Order Test | 25 | 13
Amount_dispatched是25,但我希望它是15。
知道如何更正我的SQL查询吗? 谢谢。
答案 0 :(得分:1)
首先,使用子查询对sales_order_item_invoice
中的发票金额进行汇总,然后离开加入。
SELECT
`sales_order`.*,
SUM(`sales_order_item`.`amount_dispatched`) AS dispatched,
SUM(t.`amount`) AS invoiced
FROM `sales_order`
LEFT JOIN `sales_order_item` ON `sales_order`.`id` = `sales_order_item`.`order_id`
LEFT JOIN (
SELECT item_id, SUM(amount) AS amount
FROM `sales_order_item_invoice`
GROUP BY item_id
) t ON `sales_order_item`.`id` = t.`item_id`
GROUP BY `sales_order`.`id`