Mysql SQL选择表中的一些行,使它们的总和达到某个值

Mysql SQL选择表中的一些行,使它们的总和达到某个值,mysql,select,sum,Mysql,Select,Sum,如何在下表中只选择一些行,使它们总和达到某个值 Table ----- id | qty1 | qty2 | qty3 | qty4 ------------------------------ 1 | 0.0 | 0.0 | 10 | 20 2 | 1.5 | 0.0 | 7.5 | 18 3 | 1.0 | 2.0 | 7.5 | 18 4 | 0.0 | 0.5 | 5 | 13 比如说,我想要的最高值是57 因此,我需要从上一个表中选择行,以便每行

如何在下表中只选择一些行,使它们总和达到某个值

Table
-----
id | qty1 | qty2 | qty3 | qty4
------------------------------
1  | 0.0  | 0.0  | 10   | 20
2  | 1.5  | 0.0  | 7.5  | 18
3  | 1.0  | 2.0  | 7.5  | 18
4  | 0.0  | 0.5  | 5    | 13
比如说,我想要的最高值是57

因此,我需要从上一个表中选择行,以便每行的qty1+qty2+qty3+qty4,得到该57值,并丢弃其他行。在本例中,我将得到以下结果:

id | qty1 | qty2 | qty3 | qty4
------------------------------
1  | 0.0  | 0.0  | 10   | 20
2  | 1.5  | 0.0  | 7.5  | 18
因为10+20+1.5+7.5+18=57,所以我放弃第3行和第4行

现在我希望最大值为50,那么我应该得到:

id | qty1 | qty2 | qty3 | qty4
------------------------------
1  | 0.0  | 0.0  | 10   | 20
2  | 1.5  | 0.0  | 7.5  | 11
由于这些值加起来是50,而第2行中的7则不包括qty4。。。 顺便说一句,这些行是以这种特殊的方式排序的,因为这是我希望说明qtys之和的顺序。。。将第一行、第三行、第二行和第四行相加是无效的,例如。。。它们应始终按1,2,3,4的顺序求和

如果我想补充这个怎么办?我的意思是,最后的结果中我没有得到的另外两排

第一种情况:

id | qty1 | qty2 | qty3 | qty4
------------------------------
3  | 1.0  | 2.0  | 7.5  | 18
4  | 0.0  | 0.5  | 5    | 13
第二种情况:

id | qty1 | qty2 | qty3 | qty4
------------------------------
2  | 0.0  | 0.0  | 0.0  | 7
3  | 1.0  | 2.0  | 7.5  | 18
4  | 0.0  | 0.5  | 5    | 13
如果第二个案例太复杂,那么获取:

id | qty1 | qty2 | qty3 | qty4
------------------------------
1  | 0.0  | 0.0  | 10   | 20
因为将第2行的原始QTY相加将超过50个值,所以我放弃它。。。 在这种情况下,补码应为:

id | qty1 | qty2 | qty3 | qty4
------------------------------
2  | 1.5  | 0.0  | 7.5  | 18
3  | 1.0  | 2.0  | 7.5  | 18
4  | 0.0  | 0.5  | 5    | 13

括号中的简化选项还不错:

SELECT foo1.*
  FROM foo AS foo1
  JOIN foo AS foo2
    ON foo2.id <= foo1.id
 GROUP
    BY foo1.id
HAVING SUM(foo2.qty1 + foo2.qty2 + foo2.qty3 + foo2.qty4) <= 57
;

无动机的选择要复杂得多;这是可行的,但您最好使用一个。

让我们这样说:如果SQL是一个宗教,我会为提供这个解决方案而下地狱。SQL并不是用来解决这类问题的,所以任何解决方案都是可怕的。我的也不例外:

set @limitValue := 50;
select id, newQty1, newQty2, newQty3, newQty4 from (
  select id,
  if(@limitValue - qty1 > 0, qty1, greatest(@limitValue, 0)) newQty1,
  @limitValue := @limitValue - qty1 Total1,
  if(@limitValue - qty2 > 0, qty2, greatest(@limitValue, 0)) newQty2,
  @limitValue := @limitValue - qty2 Total2,
  if(@limitValue - qty3 > 0, qty3, greatest(@limitValue, 0)) newQty3,
  @limitValue := @limitValue - qty3 Total3,
  if(@limitValue - qty4 > 0, qty4, greatest(@limitValue, 0)) newQty4,
  @limitValue := @limitValue - qty4 Total4
  from (
    select id, qty1, qty2, qty3, qty4,
      @rowTotal < @limitValue Useful,
      @previousRowTotal := @rowTotal PreviousRowTotal,
      @rowTotal := @rowTotal + qty1 + qty2 + qty3 + qty4 AllRowsTotal,
      @rowTotal - @previousRowTotal CurrentRowTotal 
    from t,
    (select @rowTotal := 0, @previousRowTotal := 0) S1
  ) MarkedUseful
  where useful = 1
) Final
补充部分:

set @limitValue := 50;
select t1.id,
  coalesce(t1.qty1 - newQty1, t1.qty1) newQty1,
  coalesce(t1.qty2 - newQty2, t1.qty2) newQty2,
  coalesce(t1.qty3 - newQty3, t1.qty3) newQty3,
  coalesce(t1.qty4 - newQty4, t1.qty4) newQty4
from t t1 left join (
    select id,
    if(@limitValue - qty1 > 0, qty1, greatest(@limitValue, 0)) newQty1,
    @limitValue := @limitValue - qty1 Total1,
    if(@limitValue - qty2 > 0, qty2, greatest(@limitValue, 0)) newQty2,
    @limitValue := @limitValue - qty2 Total2,
    if(@limitValue - qty3 > 0, qty3, greatest(@limitValue, 0)) newQty3,
    @limitValue := @limitValue - qty3 Total3,
    if(@limitValue - qty4 > 0, qty4, greatest(@limitValue, 0)) newQty4,
    @limitValue := @limitValue - qty4 Total4
    from (
      select id, qty1, qty2, qty3, qty4,
        @rowTotal < @limitValue Useful,
        @previousRowTotal := @rowTotal PreviousRowTotal,
        @rowTotal := @rowTotal + qty1 + qty2 + qty3 + qty4 AllRowsTotal,
        @rowTotal - @previousRowTotal CurrentRowTotal 
      from t,
      (select @rowTotal := 0, @previousRowTotal := 0) S1
    ) MarkedUseful
    where useful = 1
) Final
on t1.id = final.id
where Total1 < 0 or Total2 < 0 or Total3 < 0 or Total4 < 0 or final.id is null
SELECT
  id,
  IF(qty1=@qty1, qty1, qty1-@qty1) as qty1,
  IF(qty2=@qty2, qty2, qty2-@qty2) as qty2,
  IF(qty3=@qty3, qty3, qty3-@qty3) as qty3,
  IF(qty4=@qty4, qty4, qty4-@qty4) as qty4
FROM quantities q,
  (SELECT @qty1:=0.0, @qty2:=0.0,
          @qty3:=0.0, @qty4:=0.0,
          @limit:=50.0) init
WHERE
  IF(
    LEAST(
      IF(@limit-qty1 >=0,
         @limit:=(@limit-(@qty1:=qty1)),
         @qty1:=@limit + LEAST(@limit, @limit:=0)),
      IF(@limit-qty2 >=0,
         @limit:=(@limit-(@qty2:=qty2)),
         @qty2:=@limit + LEAST(@limit, @limit:=0)),
      IF(@limit-qty3 >=0,
         @limit:=(@limit-(@qty3:=qty3)),
         @qty3:=@limit + LEAST(@limit, @limit:=0)),
      IF(@limit-qty4 >=0,
         @limit:=(@limit-(@qty4:=qty4)),
         @qty4:=@limit + LEAST(@limit, @limit:=0)),
      @limit), 0, 1)
;

享受吧

让我们从问题中加载示例数据

mysql> drop database if exists javier;
Query OK, 1 row affected (0.02 sec)

mysql> create database javier;
Query OK, 1 row affected (0.01 sec)

mysql> use javier
Database changed
mysql> create table mytable
    -> (
    ->     id int not null auto_increment,
    ->     qty1 float,qty2 float,qty3 float,qty4 float,
    ->     primary key (id)
    -> );
Query OK, 0 rows affected (0.08 sec)

mysql> insert into mytable (qty1,qty2,qty3,qty4) values
    -> ( 0.0 , 0.0 , 10  , 20 ),( 1.5 , 0.0 , 7.5 , 18 ),
    -> ( 1.0 , 2.0 , 7.5 , 18 ),( 0.0 , 0.5 , 5   , 13 );
Query OK, 4 rows affected (0.05 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from mytable;
+----+------+------+------+------+
| id | qty1 | qty2 | qty3 | qty4 |
+----+------+------+------+------+
|  1 |    0 |    0 |   10 |   20 |
|  2 |  1.5 |    0 |  7.5 |   18 |
|  3 |    1 |    2 |  7.5 |   18 |
|  4 |    0 |  0.5 |    5 |   13 |
+----+------+------+------+------+
4 rows in set (0.00 sec)

mysql>
最后一个完全有效的查询 最终的查询补充完全有效 这是57的输出

mysql>     select BBBB.* from (select id,sums FROM (select A.id,A.sums from
    ->     (select id,(select sum(qty1+qty2+qty3+qty4) from mytable BB
    ->     where BB.id<=AA.id) sums from mytable AA order by id) A
    ->     INNER JOIN (SELECT 57 mylimit) B ON A.sums <= B.mylimit) AAA
    ->     UNION
    ->     (select A.id,A.sums from (select id,(select sum(qty1+qty2+qty3+qty4)
    ->     from mytable BB where BB.id<=AA.id) sums from mytable AA order by id) A
    ->     where A.sums=(select min(A.sums) sums from (select id,
    ->     (select sum(qty1+qty2+qty3+qty4) from mytable BB where BB.id<=AA.id) sums
    ->     from mytable AA order by id) A INNER JOIN (SELECT 57 mylimit) B
    ->     ON A.sums >= B.mylimit))) AAAA JOIN mytable BBBB USING (id);
+----+------+------+------+------+
| id | qty1 | qty2 | qty3 | qty4 |
+----+------+------+------+------+
|  1 |    0 |    0 |   10 |   20 |
|  2 |  1.5 |    0 |  7.5 |   18 |
+----+------+------+------+------+
2 rows in set (0.00 sec)

mysql>     select BBBB.* from  mytable BBBB LEFT JOIN
    ->     (select id,sums FROM (select A.id,A.sums from (
    ->     select id,(select sum(qty1+qty2+qty3+qty4)
    ->     from mytable BB where BB.id<=AA.id) sums
    ->     from mytable AA order by id) A INNER JOIN
    ->     (SELECT 57 mylimit) B ON A.sums <= B.mylimit) AAA
    ->     UNION
    ->     (select A.id,A.sums from (select id,
    ->     (select sum(qty1+qty2+qty3+qty4) from mytable BB
    ->     where BB.id<=AA.id) sums from mytable AA order by id) A
    ->     where A.sums=(select min(A.sums) sums from (
    ->     select id,(select sum(qty1+qty2+qty3+qty4) from mytable BB
    ->     where BB.id<=AA.id) sums from mytable AA order by id) A
    ->     INNER JOIN (SELECT 57 mylimit) B ON A.sums >= B.mylimit))) AAAA
    ->     USING (id) WHERE AAAA.id IS NULL;
+----+------+------+------+------+
| id | qty1 | qty2 | qty3 | qty4 |
+----+------+------+------+------+
|  3 |    1 |    2 |  7.5 |   18 |
|  4 |    0 |  0.5 |    5 |   13 |
+----+------+------+------+------+
2 rows in set (0.00 sec)

mysql>
这是50的输出

mysql>     select BBBB.* from (select id,sums FROM (select A.id,A.sums from
    ->     (select id,(select sum(qty1+qty2+qty3+qty4) from mytable BB
    ->     where BB.id<=AA.id) sums from mytable AA order by id) A
    ->     INNER JOIN (SELECT 50 mylimit) B ON A.sums <= B.mylimit) AAA
    ->     UNION
    ->     (select A.id,A.sums from (select id,(select sum(qty1+qty2+qty3+qty4)
    ->     from mytable BB where BB.id<=AA.id) sums from mytable AA order by id) A
    ->     where A.sums=(select min(A.sums) sums from (select id,
    ->     (select sum(qty1+qty2+qty3+qty4) from mytable BB where BB.id<=AA.id) sums
    ->     from mytable AA order by id) A INNER JOIN (SELECT 50 mylimit) B
    ->     ON A.sums >= B.mylimit))) AAAA JOIN mytable BBBB USING (id);
+----+------+------+------+------+
| id | qty1 | qty2 | qty3 | qty4 |
+----+------+------+------+------+
|  1 |    0 |    0 |   10 |   20 |
|  2 |  1.5 |    0 |  7.5 |   18 |
+----+------+------+------+------+
2 rows in set (0.00 sec)

mysql>     select BBBB.* from  mytable BBBB LEFT JOIN
    ->     (select id,sums FROM (select A.id,A.sums from (
    ->     select id,(select sum(qty1+qty2+qty3+qty4)
    ->     from mytable BB where BB.id<=AA.id) sums
    ->     from mytable AA order by id) A INNER JOIN
    ->     (SELECT 50 mylimit) B ON A.sums <= B.mylimit) AAA
    ->     UNION
    ->     (select A.id,A.sums from (select id,
    ->     (select sum(qty1+qty2+qty3+qty4) from mytable BB
    ->     where BB.id<=AA.id) sums from mytable AA order by id) A
    ->     where A.sums=(select min(A.sums) sums from (
    ->     select id,(select sum(qty1+qty2+qty3+qty4) from mytable BB
    ->     where BB.id<=AA.id) sums from mytable AA order by id) A
    ->     INNER JOIN (SELECT 50 mylimit) B ON A.sums >= B.mylimit))) AAAA
    ->     USING (id) WHERE AAAA.id IS NULL;
+----+------+------+------+------+
| id | qty1 | qty2 | qty3 | qty4 |
+----+------+------+------+------+
|  3 |    1 |    2 |  7.5 |   18 |
|  4 |    0 |  0.5 |    5 |   13 |
+----+------+------+------+------+
2 rows in set (0.01 sec)

mysql>
请记住在SELECT 50 mylimit子查询中分别设置两次mylimit的编号


请告诉我得到了这个…

您应该只调整init子查询中的@limit变量初始化。第一个查询输出数据上限,第二个查询输出其补码

SELECT
  id,
  @qty1 as qty1,
  @qty2 as qty2,
  @qty3 as qty3,
  @qty4 as qty4
FROM quantities q,
  (SELECT @qty1:=0.0, @qty2:=0.0,
          @qty3:=0.0, @qty4:=0.0,
          @limit:=50.0) init
WHERE
  IF(@limit > 0,
     GREATEST(1,
       IF(@limit-qty1 >=0,
          @limit:=(@limit-(@qty1:=qty1)),
          @qty1:=@limit + LEAST(@limit, @limit:=0)),
       IF(@limit-qty2 >=0,
          @limit:=(@limit-(@qty2:=qty2)),
          @qty2:=@limit + LEAST(@limit, @limit:=0)),
       IF(@limit-qty3 >=0,
          @limit:=(@limit-(@qty3:=qty3)),
          @qty3:=@limit + LEAST(@limit, @limit:=0)),
       IF(@limit-qty4 >=0,
          @limit:=(@limit-(@qty4:=qty4)),
          @qty4:=@limit + LEAST(@limit, @limit:=0))),0)
;
补充:

set @limitValue := 50;
select t1.id,
  coalesce(t1.qty1 - newQty1, t1.qty1) newQty1,
  coalesce(t1.qty2 - newQty2, t1.qty2) newQty2,
  coalesce(t1.qty3 - newQty3, t1.qty3) newQty3,
  coalesce(t1.qty4 - newQty4, t1.qty4) newQty4
from t t1 left join (
    select id,
    if(@limitValue - qty1 > 0, qty1, greatest(@limitValue, 0)) newQty1,
    @limitValue := @limitValue - qty1 Total1,
    if(@limitValue - qty2 > 0, qty2, greatest(@limitValue, 0)) newQty2,
    @limitValue := @limitValue - qty2 Total2,
    if(@limitValue - qty3 > 0, qty3, greatest(@limitValue, 0)) newQty3,
    @limitValue := @limitValue - qty3 Total3,
    if(@limitValue - qty4 > 0, qty4, greatest(@limitValue, 0)) newQty4,
    @limitValue := @limitValue - qty4 Total4
    from (
      select id, qty1, qty2, qty3, qty4,
        @rowTotal < @limitValue Useful,
        @previousRowTotal := @rowTotal PreviousRowTotal,
        @rowTotal := @rowTotal + qty1 + qty2 + qty3 + qty4 AllRowsTotal,
        @rowTotal - @previousRowTotal CurrentRowTotal 
      from t,
      (select @rowTotal := 0, @previousRowTotal := 0) S1
    ) MarkedUseful
    where useful = 1
) Final
on t1.id = final.id
where Total1 < 0 or Total2 < 0 or Total3 < 0 or Total4 < 0 or final.id is null
SELECT
  id,
  IF(qty1=@qty1, qty1, qty1-@qty1) as qty1,
  IF(qty2=@qty2, qty2, qty2-@qty2) as qty2,
  IF(qty3=@qty3, qty3, qty3-@qty3) as qty3,
  IF(qty4=@qty4, qty4, qty4-@qty4) as qty4
FROM quantities q,
  (SELECT @qty1:=0.0, @qty2:=0.0,
          @qty3:=0.0, @qty4:=0.0,
          @limit:=50.0) init
WHERE
  IF(
    LEAST(
      IF(@limit-qty1 >=0,
         @limit:=(@limit-(@qty1:=qty1)),
         @qty1:=@limit + LEAST(@limit, @limit:=0)),
      IF(@limit-qty2 >=0,
         @limit:=(@limit-(@qty2:=qty2)),
         @qty2:=@limit + LEAST(@limit, @limit:=0)),
      IF(@limit-qty3 >=0,
         @limit:=(@limit-(@qty3:=qty3)),
         @qty3:=@limit + LEAST(@limit, @limit:=0)),
      IF(@limit-qty4 >=0,
         @limit:=(@limit-(@qty4:=qty4)),
         @qty4:=@limit + LEAST(@limit, @limit:=0)),
      @limit), 0, 1)
;

我写过很多复杂的查询,我喜欢接受挑战,但这是一种罕见的情况,它要求您用自己选择的语言编写过程代码。即使是简化的第二种情况?文章末尾括号中的最后一个?简化的第二种情况作为查询是可行的。如果你修改你的问题来要求那样,或者创建一个新的问题来要求那样,我可以帮助你。fo 300我必须向你解释我所面临的真正问题的每一个细节,而不是仅仅展示作为示例的抽象细节,所以你们给出的解决方案不仅仅是我需要翻译或改编的概括,而是我需要的解决问题的实际解决方案。我会让你签署保密协议,因为细节是我工作中的事情,不应该让任何人知道;刚刚尝试了提供的解决方案,但是对于补码的情况,使用相同的样本数据,我没有得到您显示的结果,只是数据表中的原始4行…现在它工作了!我不知道上次我做错了什么:让我测试一下,并把它应用到我的真实案例中,我会给你一个关于赏金的答案;谢谢:不过这只是解决了我提出的简单的问题,而不是复杂的问题@哈维尔:复杂的是什么?如果您的意思是使用一些其他数字,如50,只需在两个查询中用SELECT 50 mylimit替换SELECT 57 mylimit,即最终和最终补码,它们将非常有效。否则,请解释这个复杂的案例。我将尝试使用我给出的示例数据通过示例进行解释。当mylimit=50时,查询结果应该给出id=2:qty1=1.5、qty2=0.0、qty3=7.5、qty4=11。但是,对于id=2,您的查询没有给我任何行。如您所见,qty4=11不是表在其数据中的值,而是将每行上的qty1+qty2+qty3+qty4的值相加直到达到mylimit值的结果。也就是说,当您添加:row1.qty1+row1.qty2+row1.qty3+row1.qty4-then+row2.qty1+row2.qty2+row2.qty3-then+7时达到50,该值从原始行2.qty4=18中减去,得到了您在Javier所需结果上看到的7,只需签入即可。请检查最终查询和最终查询补充。他们完全适用于57和50。我整理了我的答案,使工作查询位于顶部。我包括了57和50被处决的完整例子。谢谢!它确实适用于示例数据。让我用我的真实数据测试一下,我会回答你关于赏金的问题。。。
mysql>     select BBBB.* from (select id,sums FROM (select A.id,A.sums from
    ->     (select id,(select sum(qty1+qty2+qty3+qty4) from mytable BB
    ->     where BB.id<=AA.id) sums from mytable AA order by id) A
    ->     INNER JOIN (SELECT 50 mylimit) B ON A.sums <= B.mylimit) AAA
    ->     UNION
    ->     (select A.id,A.sums from (select id,(select sum(qty1+qty2+qty3+qty4)
    ->     from mytable BB where BB.id<=AA.id) sums from mytable AA order by id) A
    ->     where A.sums=(select min(A.sums) sums from (select id,
    ->     (select sum(qty1+qty2+qty3+qty4) from mytable BB where BB.id<=AA.id) sums
    ->     from mytable AA order by id) A INNER JOIN (SELECT 50 mylimit) B
    ->     ON A.sums >= B.mylimit))) AAAA JOIN mytable BBBB USING (id);
+----+------+------+------+------+
| id | qty1 | qty2 | qty3 | qty4 |
+----+------+------+------+------+
|  1 |    0 |    0 |   10 |   20 |
|  2 |  1.5 |    0 |  7.5 |   18 |
+----+------+------+------+------+
2 rows in set (0.00 sec)

mysql>     select BBBB.* from  mytable BBBB LEFT JOIN
    ->     (select id,sums FROM (select A.id,A.sums from (
    ->     select id,(select sum(qty1+qty2+qty3+qty4)
    ->     from mytable BB where BB.id<=AA.id) sums
    ->     from mytable AA order by id) A INNER JOIN
    ->     (SELECT 50 mylimit) B ON A.sums <= B.mylimit) AAA
    ->     UNION
    ->     (select A.id,A.sums from (select id,
    ->     (select sum(qty1+qty2+qty3+qty4) from mytable BB
    ->     where BB.id<=AA.id) sums from mytable AA order by id) A
    ->     where A.sums=(select min(A.sums) sums from (
    ->     select id,(select sum(qty1+qty2+qty3+qty4) from mytable BB
    ->     where BB.id<=AA.id) sums from mytable AA order by id) A
    ->     INNER JOIN (SELECT 50 mylimit) B ON A.sums >= B.mylimit))) AAAA
    ->     USING (id) WHERE AAAA.id IS NULL;
+----+------+------+------+------+
| id | qty1 | qty2 | qty3 | qty4 |
+----+------+------+------+------+
|  3 |    1 |    2 |  7.5 |   18 |
|  4 |    0 |  0.5 |    5 |   13 |
+----+------+------+------+------+
2 rows in set (0.01 sec)

mysql>
SELECT
  id,
  @qty1 as qty1,
  @qty2 as qty2,
  @qty3 as qty3,
  @qty4 as qty4
FROM quantities q,
  (SELECT @qty1:=0.0, @qty2:=0.0,
          @qty3:=0.0, @qty4:=0.0,
          @limit:=50.0) init
WHERE
  IF(@limit > 0,
     GREATEST(1,
       IF(@limit-qty1 >=0,
          @limit:=(@limit-(@qty1:=qty1)),
          @qty1:=@limit + LEAST(@limit, @limit:=0)),
       IF(@limit-qty2 >=0,
          @limit:=(@limit-(@qty2:=qty2)),
          @qty2:=@limit + LEAST(@limit, @limit:=0)),
       IF(@limit-qty3 >=0,
          @limit:=(@limit-(@qty3:=qty3)),
          @qty3:=@limit + LEAST(@limit, @limit:=0)),
       IF(@limit-qty4 >=0,
          @limit:=(@limit-(@qty4:=qty4)),
          @qty4:=@limit + LEAST(@limit, @limit:=0))),0)
;
SELECT
  id,
  IF(qty1=@qty1, qty1, qty1-@qty1) as qty1,
  IF(qty2=@qty2, qty2, qty2-@qty2) as qty2,
  IF(qty3=@qty3, qty3, qty3-@qty3) as qty3,
  IF(qty4=@qty4, qty4, qty4-@qty4) as qty4
FROM quantities q,
  (SELECT @qty1:=0.0, @qty2:=0.0,
          @qty3:=0.0, @qty4:=0.0,
          @limit:=50.0) init
WHERE
  IF(
    LEAST(
      IF(@limit-qty1 >=0,
         @limit:=(@limit-(@qty1:=qty1)),
         @qty1:=@limit + LEAST(@limit, @limit:=0)),
      IF(@limit-qty2 >=0,
         @limit:=(@limit-(@qty2:=qty2)),
         @qty2:=@limit + LEAST(@limit, @limit:=0)),
      IF(@limit-qty3 >=0,
         @limit:=(@limit-(@qty3:=qty3)),
         @qty3:=@limit + LEAST(@limit, @limit:=0)),
      IF(@limit-qty4 >=0,
         @limit:=(@limit-(@qty4:=qty4)),
         @qty4:=@limit + LEAST(@limit, @limit:=0)),
      @limit), 0, 1)
;