1

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

货物接收项目

  • 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它将返回所有带有item_id = 2.

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

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

4

3 回答 3

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
于 2019-12-26T09:12:57.797 回答
0

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

来自 MYSQL 文档:

...从每个组中选择值不会受到添加 ORDER BY 子句的影响。在选择了值之后对结果集进行排序,并且 ORDER BY 不会影响服务器选择的值。

以下问题的答案可能有助于更详细地说明:MYSQL GROUP BY 和 ORDER BY 未按预期协同工作

于 2019-12-26T09:13:06.213 回答
0

搜索了一圈后,我提出了以下查询

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

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

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

于 2020-01-09T10:37:04.007 回答