2010-09-03 84 views
2

我试图根据列的总和检索数据的子集。目标是发布延期交付物品的脚本。假设我们有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)是总返回数量,不只是为个别行。不知道这是可能的一个单一的查询,甚至是一个子查询,但我想先问这里的专家。我试图避免返回所有行,然后手动计数直到达到极限。

+1

你能不能用一个例子更新您的问题表架构? – 2010-09-03 15:56:51

回答

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子句等你拿第一的最古老的回单

+0

这似乎是正确的。我还必须带上另一张表,所以我已经开始使用这个PHP版本。 – Conor 2010-09-03 19:00:46

2

您需要使用由基和具有

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

+0

这很接近 - 但我希望返回第一排x行的产品,直到总订购数量= 50。所以,如果每个人都订购2,所有人都订购1或25,那么这可能是50行,等等...... – Conor 2010-09-03 16:24:10