MySQLでUPDATEの使い方・考え方について質問です。


以下のようなテーブル構成だとします。

+----+-----+----------+
+ 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人2回まで
  • 登録:2007/10/27 09:53:19
  • 終了:2007/11/03 10:00:07

回答(2件)

id:pyopyopyo No.1

pyopyopyo回答回数335ベストアンサー獲得回数792007/10/27 16:41:03

ポイント35pt

可能ではありますが,一般的にはもっとシンプルに

1 -150 2007-10-27

と新しく "-150ポイント" のレコードを insert して

id=1 のポイント数を調べる時は

select sum(point) from テーブル名 where id == 1

とその都度合計を出すように設計&実装すると思います.

id:kt26

コメントにも書きましたが、「取得日の日付は変更しない」という定義が発生します。

例えば楽天ポイントなどでよくありますが、「○~○期間の間、このポイントが使用出来る」

という仕様にする場合、どのような考え方をすればいいか悩みます。

日付にとらわれなければ、おっしゃる方法でいいとは思いますが・・。

2007/10/28 18:54:31
id:KUROX No.2

KUROX回答回数3542ベストアンサー獲得回数1402007/10/28 20:15:25

ポイント35pt

>「○~○期間の間、このポイントが使用出来る」

確定、失効という概念を導入すべきかと思います。

(1)履歴は、回答1やコメントに書かれているように普通にもつのが

  一般的。銀行の通帳明細と同じ。

(2)使えるポイントは、別もちで管理する。(履歴と連動するけど)。

------

>コメントありがとうございます。では、「-50ポイント減らす」という場合の考え方ではどう

>なるのでしょうか?

>+ 1 + 100 +2007-10-26+

>のレコードから-50するわけですよね?

違います、新規にレコードを追加(INSERT)します。

id:kt26

つまり、ポイント処理があった時に、プラス/マイナスの場合でもポイント履歴に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のままで良いのでしょうか?


考え方自体が間違っていたら、またご指摘下さい。

2007/10/29 02:34:45
  • id:F-15X
    調整履歴も残るし、
    + 1 + -150 +2007-10-28+
    をADDしたら良いのでは?
  • id:Mook
    Version 5以上でしたら、ストアードプロシージャが使用できますので、そちらを使えば出来ると思います。
    ただ、F-15Xさんの言われるように、履歴として残してそれを集計して利用した方が良いように思います。

    そうであれば、現在のポイントは
      SELECT id, SUM( point ) FROM point_table GROUP BY id
    のように集計できます。
  • id:kt26
    コメントありがとうございます。では、「-50ポイント減らす」という場合の考え方ではどうなるのでしょうか?
    + 1 + 100 +2007-10-26+
    のレコードから-50するわけですよね?

    また、日付の部分は「新しい日付になる」のではなく、「その日付に対して処理を行う」と言うことになります。

    ですので、新しい日付に上書きされるのではないし、減らすポイント数は各場面毎によって、マイナス値が変わりますから、どちらの場合にも対処するには、どういう書き方をすればいいのかと思い悩んでます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません