排名系统的数据库结构

时间:2012-07-06 09:38:48

标签: php database

我正在制作一个PHP战斗系统,需要整理排名。

我希望它如何工作就是说有100个玩家,你的等级是90.你可以挑战5级以上的玩家,所以说你挑战并击败85级的玩家,然后你变成85级而他变成86级

我不知道如何使用数据库执行此操作。如何设置或存储排名。显然我不能用你的'等级'保存一个字段,因为如果你赢了它就必须在数据库中编辑你下面的每个玩家等级,不是吗?

任何想法都会有所帮助。

3 个答案:

答案 0 :(得分: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:=@newrank+1)

填补表格中的空白。请注意,这涉及所有行!

答案 1 :(得分:1)

你确实可以在数据库中有一个排名列,并按照以下行更新:update yourtable set playerRank=playerRank+1 where playerRank>85然后将获胜的玩家更新为playerRank 85.这可能会击中大量记录,但它不会这是数据库的沉重代价。

答案 2 :(得分:0)

由于您描述的“排名”不是基于任何其他规则,例如积分......可以计算的东西,您必须在任何地方存储此排名。

是的,这确实意味着你每次都需要更新一大堆记录;但是既然你提到你只能挑战你前面的5个位置,这也意味着你每次只需要更新6个记录..(没什么大不了的)

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