从汇总的 MySQL 记录中选择

Posted

技术标签:

【中文标题】从汇总的 MySQL 记录中选择【英文标题】:Select from MySQL records that sums 【发布时间】:2009-03-03 01:43:56 【问题描述】:

我正在使用 phpmysql

我有一个名为数量的表。里面有产品名称、产品价格和产品数量的记录。除此之外,还有一些其他工具可以帮助我根据日期和位置选择最后的记录,以及名为 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】:

选项 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,因为它更“明显”,但也许这会给你一些思考的余地。

【讨论】:

我用的是第一种方法。不过,我还有很多工作要做。无论如何,这帮助我开始了。谢谢

以上是关于从汇总的 MySQL 记录中选择的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL 从每个类别中选择一个随机记录

从 MySQL 中根据日期选择记录

MySQL 如何从今天记录的表中选择数据?

MySQL:无法从特定分区中选择记录?

从 MySQL 查询中从百万行中选择第 N 条记录

通过游标从 mySQL 中选择记录返回 None 对象