[pgsql-jp: 31687] Re: 更新処理時に比較

Takashi Higuchi higuchi.takashi @ simplex-tech.co.jp
2003年 12月 3日 (水) 12:00:17 JST


こんにちは、ひぐちといいます。

mos_pgml さんは書きました:
>ゲーム結果の集計テーブルを作っております。
>(ゲームID, 最高得点, 得点合計, 人数)
>このテーブルを利用してゲーム毎に最高点と平均点を取ろうとしてます。
>
>ユーザからのゲーム結果の登録は、現在、複数回のクエリーを利用して実現できてい
>るのですが、これを一度のクエリーで処理できるものなのでしょうか?
>お知恵を拝借したく。
>
>現在の処理
>    1.テーブルロック
>    2.現在値をセレクト
>    3.(最高得点と比較:PHPで)
>    4.更新
>    5.コミット
>
>希望する処理
>    1.更新(登録する得点が最高点を超える場合は最高点カラムも更新)

直接試してはいないのですが、
CASE文を使用した以下のようなSQLはいかがでしょう?

UPDATE
 テーブル名
SET
 最高得点 = CASE WHEN 最高得点 < ユーザの得点 THEN 最高得点 ELSE ユーザの得点 END,
 得点合計 = 得点合計 + ユーザの得点,
 人数 = 人数 + 1
WHERE
 ゲームID = ユーザのゲームID

#見当違いだったらごめんなさい...。



pgsql-jp メーリングリストの案内