如何获取单个 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
- 数量
- 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
,它将 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 JOIN
和 SELECT 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
上的另一个 获取了大部分查询
我有一个table。它具有以下结构
goods_receiving_items
- id
- 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
,它将 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 JOIN
和 SELECT 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
上的另一个