MYSQL在左连接后汇总不同的值

时间:2017-07-12 14:47:14

标签: mysql select sum left-join

我有这些表

/*OrderRows*/

order_id | row_id | article | quantity
    1    |    1   |   pen   |   10
    1    |    2   |scissors |   7
    2    |    3   |  book   |   5 
    3    |    4   |  pen    |   5 

/*Shipments*/

shipment_id | row_id   | quantity_shipped
    1       |     1    |         3
    2       |     1    |         4
    3       |     1    |         3
    4       |     2    |         7
    5       |     3    |         5
    6       |     4    |         5

我需要生成一份报告来检查订单是否已完全发货

我希望使用左连接而不是subquerys(只是为了检查:它更有效吗?)

如果我问

SELECT
    OrderRows.order_id,
    sum(OrderRows.quantity) as ordered,
    sum(Shipments.quantity_shipped) as shipped
FROM
    Orders
LEFT JOIN Shipments ON OrderRows.row_id = Shipments.row_id
GROUP BY OrderRows.order_id

我显然获得了

order_id | orderered | shipped
    1    |    27    |   17
    2    |    5     |   5
    3    |    5     |   5

那是因为左连接会将Orders.quantity复制三次  对于order_id = 1(因为对于order_id = 1,有3次发货)

如何在不使用子查询的情况下获得此结果?

order_id | orderered | shipped
    1    |    17    |   17
    2    |    5     |   5
    3    |    5     |   5

1 个答案:

答案 0 :(得分:2)

如果有序/数量是order_id的属性,那么只需选择它并group by

SELECT
    Orders.order_id,
    Orders.quantity as ordered,
    sum(Shipments.quantity_shipped) as shipped
FROM
    Orders
LEFT JOIN Shipments ON Orders.order_id = Shipments.order_id
GROUP BY Orders.order_id,orders.quantity