mysql根据预期库存返回数据

标签 mysql

我有一个水果表,有 2 列日期和数量。它表示水果添加到库存的日期。

产品按照先进先出原则销售。

如果我想根据先进先出原则出售 40 个苹果,对于以下场景,我应该编写什么 sql 查询?我期待返回记录 1,2,3

+-id-+----date----+---quantity--+
 1   | 02/05/2015 |    10
 2   | 03/05/2015 |    20
 3   | 04/05/2015 |    30
 4   | 05/05/2015 |    30

select * from fruit where quantity less than < 40 order by date asc
//returns record 1 and 2 only.

最佳答案

  • 我们首先使用 Session variables 计算滚动总和.
  • 然后,使用 Derived table 中的结果集,并找到总和跨越“障碍”40 的日期。当新滚动总和大于或等于 40 时,就达到障碍。此时,我们将障碍值设置为 1,将其之前的行设置为 0,并且2 及更多,用于后面的行。
  • date 是 MySQL 中的关键字。你真的应该避免使用它作为表名;否则使用反引号括起来

尝试(适用于所有 MySQL 版本):

SELECT dt.id, 
       dt.`date`, 
       dt.quantity
FROM 
(
  SELECT 
    f.id, 
    f.`date`, 
    f.quantity, 
    @barrier := CASE
                  WHEN 
                       (@tot_qty := @tot_qty + f.quantity) >= 40
                  THEN (@barrier + 1)
                  ELSE 0
                END AS barrier 
  FROM 
    Fruit AS f 
  CROSS JOIN (SELECT @tot_qty := 0, 
                     @barrier := 0) AS user_init
  ORDER BY f.`date`
) AS dt 
WHERE dt.barrier <= 1

DB Fiddle DEMO

关于mysql根据预期库存返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52967205/

相关文章:

mysql bool 模式全文搜索

php - 查找两个日期之间的元素并将它们分组

php - ORDER BY 和 WHERE mysql 和 php

mysql - MySQL在多个表中应用通配符不起作用

PHP 数据库将哈希登录与 db 进行比较

mysql - 在 servlet 中创建指向数据库记录的超链接

php - 将 CSV 文件加载到 MySQL 中返回错误

php - 拉维尔 : How to Filter Query Builder base on user select dropdown

mysql - 如何在MySQL中使用外键选择表的一行?

使用通过文件的mysql密码特殊字符限制