如何获取单个 integer/float 列的总和等于某个值的行

How to fetch rows from which sum of a single integer/float column sums upto a certain value

我有一个table。它具有以下结构

goods_receiving_items

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

例如我有以下数据

+----+---------+----------+------------+
| 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,它将 return 所有带有 item_id = 2 的行。

应该return编辑的是 ID“5”和“4”,仅按此顺序排列

我似乎无法解决这个问题,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

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

来自 MYSQL 文档:

...the selection of values from each group cannot be influenced by adding an ORDER BY clause. Sorting of the result set occurs after values have been chosen, and ORDER BY does not affect which values the server chooses.

下面的答案可能会更详细一些:MYSQL GROUP BY and ORDER BY not working together as expected

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

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 是我们要搜索的项目。

这将 return 列 数量 的总和构成所需总和的所有行。总和将按 created_at 降序排列,然后按升序重新排列。

当库存管理系统中使用一定数量的物品时,我使用这个查询来计算成本;所以这可能会帮助其他人做同样的事情。我从 Whosebug

上的另一个 获取了大部分查询