2013-01-11 30 views
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數據庫中的數據?

+5

爲什麼不u有一個點系統,如足球聯賽表?然後按總和點排序 – ajreal

+0

因此,如果一個人擊敗另一個,你需要交換隊伍? – cartina

+0

玩家是否可以因爲任何原因降級?你的排名如何 - 按比賽次數或其他標準?我認爲總的來說,如果按照愛爾蘭人的建議計算排名,會更好。 – Revent

回答

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(找不到版本)登記在MySQL 4.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的長度在參數聲明你的數據長度以及重命名錶&領域,等等

+0

我想你的答案,謝謝你的幫助 –