1

我很难弄清楚这一点。我有这个数据库迟早会变大,它看起来像这样。

est_id |mat_id | est_qty | qty_rec
   2   |  29   |    50   |    0
   3   |  29   |    70   |    0
   8   |  29   |   100   |    0

现在,我想要完成的是更新一行,直到 est_qty 和 qty_rec 相等,然后再移动到另一行。我开始了一个代码,但它不工作。

    foreach($mat_id as $mat_id_key => $mat){
    while($rec_qty > 0){
        $remBal = $est_qty[$mat_id_key] - $qty_rec[$mat_id_key];
        if(($remBal - $rec_qty) >= 0){
            mysql_query('UPDATE `estimates` SET `qty_rec` = `qty_rec` + '.$rec_qty.' WHERE `proj_id` = "'.$proj_id.'" AND `mat_id` = "'.$mat[$mat_id_key].'"');
        }
    }
}

在此代码中,每一行都将进入循环,直到它满足 est_qty 和$rec_qtya 之间的差值大于或等于零的条件,它将更新该行。

例如,用户输入 30 作为$rec_qty,数据库现在看起来像:

est_id |mat_id | est_qty | qty_rec
   2   |  29   |    50   |   30
   3   |  29   |    70   |    0
   8   |  29   |   100   |    0

当用户第二次输入时,例如 40 as $rec_qty,数据库现在看起来像:

est_id |mat_id | est_qty | qty_rec
   2   |  29   |    50   |   50
   3   |  29   |    70   |   20
   8   |  29   |   100   |    0
4

3 回答 3

1

这是一个基于集合的单个查询来执行此操作,尽管它使用triangular-join

update est as e
    join (
        select *
            , case when needed - room_below > room then room else needed - room_below end as to_add
        from (
            select *
                , est_qty - qty_rec as room
                , (select coalesce(sum(est_qty - qty_rec), 0) from est where mat_id = a.mat_id and est_id < a.est_id) as room_below
                , 30 as needed -- Variable?
            from est as a
        ) as b
    ) as c on e.est_id = c.est_id
set e.qty_rec = e.qty_rec + c.to_add    
where e.mat_id = 29 -- Variable?
    and c.to_add > 0;

应该注意的是,这没有处理溢出条件的逻辑,在这种情况下,您尝试插入比现有记录更大的数字(您可能必须插入新记录来保存剩余记录) .

这里有一个 SqlFiddle 演示。

于 2013-01-30T16:31:47.847 回答
0

因为您的表没有唯一的 id,所以您的 UPDATE 将更新与 proj_id 和 mat_id 匹配的所有行。因此,如果您从以下内容开始:

mat_id | est_qty | qty_rec
  29   |    50   |   30
  29   |    70   |    0
  29   |   100   |    0

再加上 40,你会得到:

mat_id | est_qty | qty_rec
  29   |    50   |   70
  29   |    70   |   70
  29   |   100   |   70

甚至:

mat_id | est_qty | qty_rec
  29   |    50   |   40
  29   |    70   |   40
  29   |   100   |   40

...取决于首先找到哪一行。

向表中添加主键,然后根据此 ID 更新记录。

于 2013-01-30T15:28:39.623 回答
0

你不需要循环。这两个查询应该足够了:

mysql_query("set @remain := $rec_qty");
mysql_query(
  "update estimates
     set qty_rec = @remain,
         qty_rec = qty_rec - (@remain := if( qty_rec > est_qty, qty_rec - est_qty, 0)
     where mat_id = $matId
   order by est_id"
);

$matId 是您要更新的 mat_id。

于 2013-01-30T16:07:13.860 回答