我正在使用 PHP 和 MySQL。
我有一个名为数量的表。里面有商品名称、商品价格、商品数量的记录。除了这些,还有一些其他的可以帮助我根据日期和位置选择最后的记录,以及一个名为价格的字段的 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,因为它更“明显”,但也许这会给您一些思考的余地。
关于php - 从求和的 MySQL 记录中选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/604800/