2012-07-06 138 views
0

我正在製作一個PHP戰鬥系統,並需要對排名進行排序。排名系統的數據庫結構

我想要它的工作方式是說有100名玩家,而你的等級是90.你可以挑戰5級以上的玩家,所以說你挑戰並擊敗85級玩家,然後你成爲85級, 86.

我不知道如何用數據庫做到這一點。如何設定或存儲等級。很顯然,我不能用你的'等級'保存一個領域,因爲如果你贏了,它必須在數據庫中編輯你下面的每一個球員級別,不是嗎?

任何想法都會有所幫助。

回答

1

我建議你做保持秩場和放鬆的瓶頸在查詢:

在您的例子使用類似

UPDATE players 
SET rank=IF(playerid=<id-of-challengin-player>,rank-5,rank+1) 
WHERE rank>=85 AND rank<=90 

這將改變行列

old new 
85 86 
86 87 
87 88 
88 89 
89 90 
90 85 

它看起來像你想要的,但使用一個查詢,它可以利用索引,只觸及6行。

編輯

維修方便(固定等級號碼,如果有洞等),運行

CREATE VIEW players_by_rank AS 
SELECT * FROM players ORDER BY rank 

一次,然後用

UPDATE (SELECT @newrank:=0) AS init, players_by_rank 
SET score=(@newrank:[email protected]+1) 

,收在缺口桌子。請注意,這觸及所有行!

+0

謝謝,我沒'不知道它只會更新6,我錯誤地認爲它將不得不編輯下面的所有級別。 – user1022585 2012-07-06 09:48:55

+0

如果一條記錄也被刪除了,那就會搞砸了:o – user1022585 2012-07-06 09:57:19

+0

你通常不是通過真正刪除記錄來解決這個問題(起初),而是設置一個字段,比如'SET active = 0'。然後你運行'UPDATE players SET rank = IF(playerid = [刪除玩家ID], - 1 * rank,rank-1)WHERE rank> [刪除玩家等級]',在那裏你可以刪除它沒有傷害。 – 2012-07-06 10:01:48

0

由於您描述的'等級'不是基於任何其他規則,如點。可以計算的東西,您必須在任何地方存儲此等級。

而且,這確實意味着你需要每次更新一大堆記錄;但既然你提到你只能挑戰多達5個位置在你前面,這也意味着你永遠只能有更新6條每次..(沒什麼大不了)

90 -> 85 
89 -> 90 
88 -> 89 
87 -> 88 
86 -> 87 
85 -> 86 
+0

而在排名中的球員需要更新 – Oritm 2012-07-06 09:45:50

+0

對不起,不想抄襲......我在寫你的回答時提交你的 – 2012-07-06 09:46:06

+0

@EugenRieck:沒問題:) – Evert 2012-07-06 09:47:43

1

你確實可以在數據庫中有一個排名欄,並沿着以下方向更新:update yourtable set playerRank=playerRank+1 where playerRank>85然後將獲勝的玩家更新爲玩家排名85.這可能會觸及很多記錄,但這不會是一個沉重的代價到數據庫。