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].'"');
        }
    }
}

$rec_qtyこのコードでは、各行がループに入り、est_qty と0 以上の差である条件を満たすまで、その行を更新します。

たとえば、ユーザーが として 30 を入力する$rec_qtyと、データベースは次のようになります。

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

ユーザーが 2 回目に、たとえば 40 を として入力する$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

これを行うためのセットベースの単一クエリを次に示しますが、三角結合を使用しています。

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

ループは必要ありません。次の 2 つのクエリで十分です。

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 に答える
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 に答える