[PHP-users 4089] Re: あるSQL テーブルの中でユニークなランクをつけられたユーザのランクを変更する場合の方法
Tatsuro Nakagawa
php-users@php.gr.jp
Mon, 03 Dec 2001 18:38:10 +0900
中川@magicです。
始めまして。
ステップ1:
SELECT ランク FROM テーブル WHERE ユーザID=$userid; -> 結果A
ランクのみがユニークキーなら・・・(ランク+ユーザID、およびにユーザIDのみがユニー
クなら必要ありません)
UPDATEで仮のランク(例えば9999とか)に変更しておく
ステップ2:
UPDATE テーブル SET ランク=ランク+1 WHERE ランク>=$newrank AND ランク<結果A;
ステップ3:
UPDATE テーブル SET ランク=$newrank WHERE ユーザID=$userid;
のようなロジックでちょっとはSQL文の発行回数をちじめられると思うのですが。
# どこか間違いがあるかも・・・
ちなみに、これだけのUpdate文がある場合、BEGIN->COMMIT等でトランザクション管理を
することをお勧めしますが、私はPostgreSQLやOracleしか経験が無いので・・・MySQLで
もできるのでしょうか?(すいません、無責任で)
この方法ですと・・・最後のSELECT文の結果によって帰ってきたレコード文の数Updateす
るよりは良いと思うのですが、いかがでしょうか?
(1〜1000ランクあって、2位に上がると・・・999回のUpdateが走りますからね・・・)
--Reply-- "kz-ml" <sendoh@anet.ne.jp> --
> function move($userid, $newrank){
> $sql = "UPDATE テーブル SET ランク=ランク+1 WHERE ランク>=$newrank";
> mysql_query($sql);
> $sql = "UPDATE テーブル SET ランク=$newrank WHERE ユーザID=$userid";
> mysql_query($sql);
> $sql = "SELECT ユーザID FROM テーブル ORDER BY ランク,ユーザID ASC";
> $i = 0;
> while($row=mysql_fetch_array(mysql_query($result))){
> mysql_query("UPDATE テーブル SET ランク=$i WHERE ユーザID=$row[ユーザ
> ID]");
> $i++;
> }
> }
>
--
Tatsuro Nakagawa