[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