【问题标题】:How to fetch rows from which sum of a single integer/float column sums upto a certain value如何获取单个整数/浮点列的总和达到某个值的行
【发布时间】:2020-04-16 13:29:23
【问题描述】:

我有一张桌子。它具有以下结构

goods_receiving_items

  • 身份证
  • item_id
  • 数量
  • created_at

我正在尝试获取符合以下条件的行

  • 有一个 item_id

  • 当数量列之和等于某个值时

所以例如我有以下数据

+----+---------+----------+------------+
| id | item_id | quantity | created_at |
+----+---------+----------+------------+
|  1 |       2 |       11 | 2019-10-10 |
|  2 |       3 |      110 | 2019-10-11 |
|  3 |       2 |       20 | 2019-11-09 |
|  4 |       2 |        5 | 2019-11-10 |
|  5 |       2 |        1 | 2019-11-11 |
+----+---------+----------+------------+

我尝试了以下查询:

SET @sum:= 0;
SELECT   item_id, created_at, (@sum:= @sum + quantity) AS SUM, quantity 
FROM     goods_receiving_items
WHERE    item_id = 2 AND @sum<= 6
ORDER BY created_at DESC

如果我不使用ORDER BY,那么查询将给我 ID '1'。但是如果我使用ORDER BY,它将返回所有带有item_id = 2 的行。

应按此顺序仅返回 ID '5' 和 '4'

我似乎无法解决这个问题,ORDER BY 对我的任务至关重要。 任何帮助将不胜感激

【问题讨论】:

    标签: mysql mysql-variables


    【解决方案1】:

    您应该在结果集上使用 order by 你可以使用子查询来做到这一点

      SET @sum:= 0;
    
      select t.* 
      from t (
        SELECT item_id
            , created_at
            , (@sum:= @sum + quantity) as sum
            , quantity 
        FROM goods_receiving_items
        WHERE item_id = 2 AND @sum<= 6
      ) t
      ORDER BY created_at DESC
    

    【讨论】:

    • 这只是在达到总和后对结果进行排序。我需要的是从最新的行开始计算总和,即具有最大的“created_at”值
    【解决方案2】:

    您应该尝试使用INNER JOINSELECT min(created_at)SELECT max(created_at)

    来自 MYSQL 文档:

    ...从每个组中选择的值不会受到影响 添加 ORDER BY 子句。结果集的排序发生在 值已被选择,并且 ORDER BY 不会影响哪个值 服务器选择。

    以下问题的答案可能会有所帮助:MYSQL GROUP BY and ORDER BY not working together as expected

    【讨论】:

    • 这不只是从表中获取一个值吗?
    【解决方案3】:

    四处搜索后,我提出了以下查询

    SELECT 
    t.id, t.quantity, t.created_at, t.sum
          FROM 
           ( SELECT 
              *,
              @bal := @bal + quantity AS sum,
              IF(@bal >= $search_number, @doneHere := @doneHere + 1 , @doneHere) AS whereToStop
                FROM goods_receiving_items
                CROSS JOIN (SELECT @bal := 0.0 , @doneHere := 0) var
                WHERE item_id = $item_id
                ORDER BY created_at DESC) AS t
                        WHERE t.whereToStop <= 1
                        ORDER BY t.created_at ASC
    

    在上述查询中,$search_number 是一个变量,用于保存必须达到的值。 $item_id 是我们正在搜索的项目。

    这将返回 quantity 列的总和构成所需总和的所有行。总和将由 created_at 以降序排列的行进行,然后将按升序重新排列。

    当库存管理系统中使用一定数量的物品时,我使用此查询来计算成本;所以这可能会帮助其他人做同样的事情。我在 StackOverflow 上从另一个 question 获取了大部分查询

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-24
      • 2022-01-04
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多