从MySQL记录中选择总和

问题描述:

我知道这里有一些关于选择记录的帖子,直到从一个字段的总和中满足某个数字,但没有任何适合我的记录。我使用PHP和MySQL。从MySQL记录中选择总和

我有一个名为数量的表。里面有产品名称,产品价格和产品数量的记录。除此之外,还有一些可帮助我根据日期和位置选择最后的记录,还可以根据名为价格的字段选择最后的记录,因为同一产品有不同的数量和不同的价格。所以,我现在选择我的产品的具体价格和数量是这样的:

SELECT `price`,`quantity` FROM (SELECT `price`,`quantity` FROM `quantity` WHERE `product_name` = 'DELL' ORDER BY `date` DESC, `position`) AS `Actions` GROUP BY `price` 

这个查询是一个解决方法,因为我需要得到这样的数据:

product_name | price | quantity 

DELL   |  100 |  30 
DELL   |  120 |  10 
DELL   |  130 |  2 

asuming我有多个记录,像这样的我需要得到他们最新的。无论如何,从这个查询我需要做到以下几点:我需要选择数量与其他产品的数量总和等于35的记录。因此,通过使用我的查询,我知道它应该停在第2行,因为我可以将30个产品价格为100美元,另有5件产品的价格为120美元。然后我需要输入我的更新。因此,新数据应该如下所示:

product_name | price | quantity 

DELL   |  100 |  0 
DELL   |  120 |  5 
DELL   |  130 |  2 

在这个世界上我将如何实现这个目标?我希望我的细节清楚。请提出任何问题。

谢谢你的时间!

方法1:使用程序逻辑,而不是一个查询:

有什么不妥使用编程层做更先进的数据库交互。 SQL不是对所有东西的答案......(也考虑存储过程)。

enough = 35 
running_total = 0 

START TRANSACTION 
while running_total < enough: 
    select one record order by price limit 1 FOR UPDATE 
    add to running_total 

UPDATE records... 
COMMIT 

选项2:使用查询与运行总计:

在这个选项中,你得到的运行总计使用派生的查询,然后筛选到特定记录外部查询。如果您打算更新它们,则应该将其包含在具有正确隔离级别的事务中。

SET @running_total = 0; 
SELECT 
    row_id, 
    product_name, 
    price, 
    quantity 
FROM 
    (
    SELECT 
     row_id, 
     product_name, 
     price, 
     quantity, 
     @running_total := @running_total + quantity AS running_total 
    FROM 
     sometable 
    WHERE 
     quantity > 0 
    ORDER BY 
     quantity 
    LIMIT 
     35 /* for performance reasons :) */ 
    ) as T1 
WHERE 
    running_total < 35 

我会倾向于选择选项1,因为它更“显而易见”,但或许这会给你思考的一些食物。

+0

我已经使用了第一种方法。尽管如此,我还有很多工作要做。无论如何,这帮助我开始。谢谢 – 2009-03-03 14:56:47