基于列的总和返回行

时间:2010-09-03 15:55:00

标签: php sql mysql

我正在尝试根据列的总和检索数据子集。目标是发布延期交货项目的脚本。假设我们有100个BO产品并且有50个库存。我想更新订单数量总和的最旧订单。 50.所以类似:

示例架构:

Orders Table:
order_id, order_date

order_products Table:
order_product_id, order_id, product_id, product_status, ordered_quantity


select * from products 
where products_id=1234 
and status=1 
and sum(products_qty) < 50;   

其中sum(products_qty)是返回的总数量,而不仅仅是单个行。不确定单个查询甚至是子查询是否可行,但我想先问问专家。我试图避免返回所有行,然后手动计数直到达到极限。

2 个答案:

答案 0 :(得分:2)

您需要使用GROUP by和Having

select * from products 
where products_id=1234 
and status=1 
group by YourGroupingFields
Having sum(products_qty) < 50;   

根据您的信息:

select product_id from products 
where status=1 
group by product_id
Having sum(products_qty) < 50;   

将返回product_id,总数量减去50

答案 1 :(得分:0)

当您使用SUM()COUNT()等聚合函数时,不能在WHERE子句中使用它们。当数据库扫描表/索引时,WHERE子句逐行应用,这意味着聚合函数的结果尚不可用。

必须使用HAVING进行聚合结果过滤,这基本上是在将数据返回给客户端之前的最后一步。

根据您的要求,您需要保留一个运行计数,直到您检索到足够的行/订单以用完所输入的新产品。单个查询无法完成此操作。您需要使用服务器端变量来跟踪各个延期交货商“已用完”的产品数量。

脱离我的头脑,这样的事情可能会成功:

SET @Available = 50;

SELECT order_id, SUM(ordered_quantity), @Available := @Available - SUM(ordered_quantity) AS available
FROM order_products
WHERE product_id = XXX
GROUP BY order_id, product_id
HAVING available >= 0;

使用任何额外的WHERE子句,这样您就可以获得最早的延期交货