MYSQL左联接后求和不同值
我有这些桌子MYSQL左联接后求和不同值,mysql,select,sum,left-join,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_
/*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
我需要生成一份报告来检查订单是否已全部发货
我希望使用左连接而不是子查询(只是为了检查:它是否更有效?)
如果我问
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
那是因为左连接会将订单数量复制三次
对于订单号=1(因为对于订单号=1,有3批装运)
如何在不使用子查询的情况下获取此信息
order_id | orderered | shipped
1 | 17 | 17
2 | 5 | 5
3 | 5 | 5
如果ordered/quantity是
order\u id
的一个属性,那么只需选择它并groupby
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
如果ordered/quantity是
order\u id
的一个属性,那么只需选择它并groupby
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
哈你的回答是对的,但我的代码太复杂了,这些是订单行,而不仅仅是订单,因此如果我按orders.quantity分组,我会在结果集中获得一个重复的行。我更新了我的问题以显示这一点。抱歉,当您的数据模型错误时,因为同一订单有多行!如果您想坚持知道所有行的数量都相同,只需选择MAX not sum。所有行的数量都不相同,它与该订单上特定物品的数量有关,事实上,对于订单_id=1,有两行的数量=10,这只是一种情况。我编辑它是为了不产生混乱哈!你的回答是对的,但我的代码太复杂了,这些是订单行,而不仅仅是订单,因此如果我按orders.quantity分组,我会在结果集中获得一个重复的行。我更新了我的问题以显示这一点。抱歉,当您的数据模型错误时,因为同一订单有多行!如果您想坚持知道所有行的数量都相同,只需选择MAX not sum。所有行的数量都不相同,它与该订单上特定物品的数量有关,事实上,对于订单_id=1,有两行的数量=10,这只是一种情况。我编辑它是为了不引起混乱