如何选择直到达到某个数值的总和

5

有这个表格

#table stock
+-------+----------+
|  id   |   stock  |
+-------+----------+
|   1   |    20    |
+-------+----------+
|   2   |    25    |
+-------+----------+
|   3   |    10    |
+-------+----------+
|   4   |    20    |
+-------+----------+
#note: this is an arbitrary random data

如何从表中选择行,直到 stock 列的 sum() 达到某个值或稍微高一些,并按照 id ASC 的顺序排序。

例如,我想选择表中的行,直到库存总量达到'50',所以结果将是

#result 3 rows
+-------+----------+
|  id   |   stock  |
+-------+----------+
|   1   |    20    |
+-------+----------+
|   2   |    25    |
+-------+----------+
|   3   |    10    |
+-------+----------+

现在库存总量为“55”,这是比“50”更接近的最高值。如果我们取下一行id:4,则库存总量将高于50;如果我们删除行id:3,则值将为45,小于我想要的50。
我可以通过选择所有行并循环它们来使用PHP实现这一点,但我认为这将是浪费的。是否有可能以较低的级别完成,并让mysql通过一个sql查询为我完成? 谢谢你,如果我弄错了什么,请原谅,我是编程新手。
1个回答

5
你需要累计总和才能使它正常运行。其中一种方法使用变量:
select t.*
from (select t.*, (@sum := @sum + stock) as cume_stock
      from t cross join
           (select @sum := 0) params
      order by id 
     ) t
where cume_stock < 50 or (cume_stock >= 50 and cume_stock - stock < 50);

非常感谢您的时间,先生。顺便说一下,您的名字让我感觉到:“不加思索,这就是我想要做的事情”。 - Accountant م
非常抱歉再次打扰您,但我遇到了一个语法错误。 "错误代码:1064。您的SQL语法存在错误;请检查与您的MariaDB服务器版本相对应的手册,以获取正确的语法使用方式,位于第6行附近的') t where cume_stock < 50 or (cume_stock >= 50 and cume_stock - stock < 50)'。0.000秒" - Accountant م
我将子查询中的连接子句移到了排序子句之前,即 "from t cross join (select @sum := 0) params order by id",语法错误已经消失。这样做是否会给我带来相同的正确结果? - Accountant م

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接