裏MySQL MySQL のユーザー変数で支払いの繰越処理 2

繰越処理 1でユーザー変数を使うとlimitやorder byを使ったソートの処理がめんどうになる。limitやorder byを使うことが想定される場合は、あらかじめ、paymentとcarry_overのカラムを追加しておいて

CREATE TABLE  `payment` (
`month_year` DATE NOT NULL ,
`revenue`    INT  NOT NULL DEFAULT  '0',
`payment`    INT  NOT NULL DEFAULT  '0',
`carry_over` INT  NOT NULL DEFAULT  '0',
PRIMARY KEY (  `month_year` )
) ENGINE = INNODB
INSERT INTO payment (month_year,revenue) values 
  ( "2008/04/00",3000 ),
  ( "2008/05/00",1000 ),
  ( "2008/06/00",2000 ),
  ( "2008/07/00",7000 ),
  ( "2008/08/00",1000 );

以下のupdate文でまとめて更新してしまって使うとよい

SET @carry_over:=0;
UPDATE payment  SET 
    payment=IF(revenue+@carry_over>=5000,
    revenue+@carry_over+(@carry_over:=0),
    (@carry_over:=@carry_over+revenue)*0),
    carry_over=@carry_over 
ORDER BY month_year ASC;