我有一个问题,其中包括3个这样的表(我仅显示有意义的字段):
表顺序:
id
date
每个订单可以有更多行:
表OrderRows:
id
order_id
article_id
quantity
quantity_evaded
quantity_available
现在在订单列表中,我进行这样的查询以总结订单的所有值
SELECT o.*,
SUM(r.quantity) quantity, SUM(r.quantity_evaded) evaded,
SUM(r.quantity_available) available
FROM `Orders` AS `o`
LEFT JOIN `OrderRows` as `r` ON `r`.`order_id`=`o`.`id`
GROUP BY `o`.`id`
现在的问题是,该查询没有告诉我有关订单是否可以关闭的事实。当订单中的所有商品对每一行都有足够的可用性时,可以关闭该订单。让我们举个例子,我有一个订单,其中有2条商品,A条和B条,每条的订购量为5,A的可用性为10,B的可用性为2。
可用性的总和为12(10 + 2),超过了订购的数量10,但我没有足够的商品用于商品B(订购的商品中只有5个中的2个)。有没有一种方法可以使总和计入特定的最大值,或者我唯一的方法就是循环订单的所有行并检查所有奇异行是否具有足够的可用性?
答案 0 :(得分:1)
您需要在 之前应用聚合函数进行比较:
SELECT o.*,
SUM(r.quantity) as quantity,
SUM(r.quantity_evaded) as evaded,
SUM(r.quantity_available) as available,
NOT MAX( r.quantity > r.quantity_available ) as is_closed
FROM `Orders` `o` LEFT JOIN
`OrderRows` `r`
ON `r`.`order_id` = `o`.`id`
GROUP BY o.id;
如果无法关闭订单,表达式r.quantity > r.quantity_available
将返回1
。 MAX()
确定任何文章是否满足此条件。
注意:这是假设订单中没有重复的商品。
答案 1 :(得分:0)
执行一个累积的总和结果集,然后对总和小于可用数量的结果集进行过滤。这样您将获得可用数量的订单。