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

我有一张名为quantity的表。里面有产品名称,产品价格和产品数量的记录。除此之外,还有一些其他可以帮助我根据日期和位置选择最后的记录,以及一个名为price的字段GROUP BY,因为同一产品的价格不同有不同的数量。所以,我目前选择我的产品具体价格和数量如下:

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

假设我有多个像这样的记录,我需要得到最新的记录。无论如何,从这个查询我需要做以下事情:我需要选择与另一个产品的数量相等的记录数量等于35.因此,通过使用我的查询我知道它应该停在第2行,因为我可以采取30个产品100美元的价格和2号线的另外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,因为它更“明显”,但也许这会给你一些思考的食物。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top