一库存表,同一商品A可能有不同批次的进货,在出库时先进货的先出库。示例表如下(进货批次越小进货越早)商品名称       数量     进货批次
AAA            10       1
AAA            10       2
AAA            10       3假设商品AAA出库5个,则记录应是以下商品名称       数量     进货批次
AAA            5        1
AAA            10       2
AAA            10       3假设商品AAA出库12个,则记录应是以下商品名称       数量     进货批次
AAA            0        1
AAA            8        2
AAA            10       3假设商品AAA出库26个,则记录应是以下商品名称       数量     进货批次
AAA            0        1
AAA            0        2
AAA            4        3就是类似于上边示例中的数据,我现在解决方案比较麻烦,把某一商品的库存全部查询出来,然后递归,根据出库数量和库存数量计算出这些记录该扣掉多少数字或者不扣数字,然后再UPDATE这些记录。请问有没有一个方便点的解决方案或者一条SQL语句能解决的?谢谢了。

解决方案 »

  1.   

    表结构中应该有记录id字段的吧,有的话只需查询出所有的记录,然后用PHP计算需要扣除数量的记录(计算方法也比较简单),再构造并执行一条UPDATE语句就行了啊。
      

  2.   

    唉。。写了点代码才发现上面的思路有硬伤啊。。UPDATE只能更新一条记录,看来还是得构造并执行多条UPDATE语句。。//根据查询到的结果,构造出这样一个数组
    $ar_result = array(
    10001 => 10, //假设10001为记录id,10为数量
    10002 => 10,
    10003 => 10
    );//计算出库,这里未考虑出库数量大于库存数量的情况
    function deliver($amount, $ar_result) {
    $ar = array();
    foreach($ar_result as $k => $v) {
    if ($amount > 0) {
    if ($amount < $v) {
    $ar[$k] = $v - $amount;
    break;
    }
    else {
    $ar[$k] = 0;
    $amount -= $v;
    }
    }
    }
    return $ar;
    }//根据计算结果构造UPDATE语句
    $ar  = deliver(26, $ar_result);
    /*
    Array
    (
        [10001] => 0
        [10002] => 0
        [10003] => 4
    )
    */
      

  3.   

    楼主你这结贴效率也太高了,放两天,说不定有更好的方法。刚google了一下,貌似利用CASE语法可以批量更新的,但我看了几个有关的网页,还不太理解具体用法,你可以研究一下。
      

  4.   

    一个方案:
    set @x=14;
    update inv
    set num=if(@x>=num, 0, num-@x) + (@x:=if(@x>=num, @x-num, 0 ) )*0
    where name='a' 
    order by seq
    ;