以下のようなテーブル構成だとします。
+----+-----+----------+
+ id +point+ date +
+----+-----+----------+
+ 1 + 100 +2007-10-26+
+----+-----+----------+
+ 1 + 100 +2007-10-27+
+----+-----+----------+
こういう場合に、id=1のpointを150減らしたいとします。
上記2レコードを合算して、上のレコードのpointを0にし、下のpointを50に出来ればと思います。
そういう事って出来るのでしょうか?処理を分ければ出来ると思うのですが、よりシンプルで柔軟性のあるSQL文が書ければと思いますので、より良い方法をご存じの方は、アドバイスいただければと思います。
ちなみにMySQL4.0.26を使っています。もし上位バージョンで私が考えていることが可能なら、ご提案下さい。
可能ではありますが,一般的にはもっとシンプルに
1 -150 2007-10-27
と新しく "-150ポイント" のレコードを insert して
id=1 のポイント数を調べる時は
select sum(point) from テーブル名 where id == 1
とその都度合計を出すように設計&実装すると思います.
>「○~○期間の間、このポイントが使用出来る」
確定、失効という概念を導入すべきかと思います。
(1)履歴は、回答1やコメントに書かれているように普通にもつのが
一般的。銀行の通帳明細と同じ。
(2)使えるポイントは、別もちで管理する。(履歴と連動するけど)。
------
>コメントありがとうございます。では、「-50ポイント減らす」という場合の考え方ではどう
>なるのでしょうか?
>+ 1 + 100 +2007-10-26+
>のレコードから-50するわけですよね?
違います、新規にレコードを追加(INSERT)します。
つまり、ポイント処理があった時に、プラス/マイナスの場合でもポイント履歴にINSERTし、
合計ポイントのテーブルにはupdateするということですね?
ポイントの有効期間が切れる時は、履歴を消して合計ポイントにupdateするような。
[追記]
履歴に↓のように残るとして
id | point | date |
---|---|---|
1 | 100 | 2007-09-01 |
1 | 100 | 2007-10-01 |
1 | -200 | 2007-10-30 |
10月分のポイントしか有効期限にしなかった時、9月のレコードを削除しますよね?
その場合、合計値は-100にするのではなく、0のままで良いのでしょうか?
考え方自体が間違っていたら、またご指摘下さい。
コメントにも書きましたが、「取得日の日付は変更しない」という定義が発生します。
例えば楽天ポイントなどでよくありますが、「○~○期間の間、このポイントが使用出来る」
という仕様にする場合、どのような考え方をすればいいか悩みます。
日付にとらわれなければ、おっしゃる方法でいいとは思いますが・・。