请教一算法问题

pimple 2012-05-07 09:40:08
一库存表,同一商品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语句能解决的?谢谢了。

...全文
119 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
helloyou0 2012-05-07
  • 打赏
  • 举报
回复
一个方案:
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
;
乌镇程序员 2012-05-07
  • 打赏
  • 举报
回复
楼主你这结贴效率也太高了,放两天,说不定有更好的方法。刚google了一下,貌似利用CASE语法可以批量更新的,但我看了几个有关的网页,还不太理解具体用法,你可以研究一下。
pimple 2012-05-07
  • 打赏
  • 举报
回复
谢谢楼上的,看来没有更发的办法,我现在用的办法和你写的差不多。谢谢了。
乌镇程序员 2012-05-07
  • 打赏
  • 举报
回复
唉。。写了点代码才发现上面的思路有硬伤啊。。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
)
*/
乌镇程序员 2012-05-07
  • 打赏
  • 举报
回复
表结构中应该有记录id字段的吧,有的话只需查询出所有的记录,然后用PHP计算需要扣除数量的记录(计算方法也比较简单),再构造并执行一条UPDATE语句就行了啊。

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧