0

ここで、ゲームのランキングシステムを作成したいと思います。しばらくの間、現在のランキングを次のように想定します。

player  rank        
A       : 1 
B       : 2     
C       : 3 
D       : 4 
E       : 5 

マッチでプレイヤーDがプレイヤーBを倒した後、ランクは次のように変わります。

player  rank        
A       :  1    
D       :  2    
B       :  3    
C       :  4    
E       :  5    

mysqlデータベースのデータを効率的に更新するにはどうすればよいですか?

4

1 に答える 1

1

私はストアドプロシージャの専門家ではありませんが、パラメータ「player1」と「player2」を使用してストアドプロシージャを作成すると、player1が上位のプレーヤーになり、次のように機能する可能性があります。

# Get current player ranks
SET @player1rank = (SELECT `Rank` FROM `RankTable` WHERE `Player` = player1);
SET @player2rank = (SELECT `Rank` FROM `RankTable` WHERE `Player` = player2);
# Drop ranks for player 1 down to player 2
UPDATE `RankTable` SET `Rank` = `Rank`+1 WHERE `Rank` >= @player1rank AND `Rank` < @player2rank;
# Now update player2's rank
UPDATE `RankTable` SET `Rank` = @player1rank WHERE `Player` = player2;

ストアドプロシージャとして、これは非常に高速に実行されます。テーブルが大きくなった場合の追加の利点です。

これが私の試みです。PhpMyAdminを使用してMySQL4.0に登録されません(バージョンが見つかりません)が、MySQL 5以降で動作する可能性があり、正しい方向に進むことができれば幸いです...

DELIMITER $$
CREATE PROCEDURE rerank_players (IN player1 VARCHAR (100), IN player2 VARCHAR (100))
BEGIN
   DECLARE player1rank, player2rank INT;
   SET player1rank = (SELECT Rank FROM RankTable WHERE Player = player1);
   SET player2rank = (SELECT Rank FROM RankTable WHERE Player = player2);
   UPDATE RankTable SET Rank = Rank+1 WHERE Rank >= player1rank AND Rank < player2rank;
   UPDATE RankTable SET Rank = player1rank WHERE Player = player2;
END
$$

パラメータ宣言のVARCHARの長さをデータの長さに調整したり、テーブルやフィールドの名前を変更したりする必要があります。

于 2013-01-11T07:42:18.427 に答える