Php 排名系统的数据库结构
我正在制作一个PHP战斗系统,需要整理排名 我想让它工作的方式是假设有100名球员,而你的排名是90。你可以挑战5级以上的玩家,所以假设你挑战并击败85级的玩家,那么你变成85级,他变成86级 不过,我不知道如何使用数据库来实现这一点。如何设置,或存储等级。显然,我不能用你的“排名”保存一个字段,因为如果你赢了,它必须编辑数据库中低于你的每个玩家的排名,不是吗Php 排名系统的数据库结构,php,database,Php,Database,我正在制作一个PHP战斗系统,需要整理排名 我想让它工作的方式是假设有100名球员,而你的排名是90。你可以挑战5级以上的玩家,所以假设你挑战并击败85级的玩家,那么你变成85级,他变成86级 不过,我不知道如何使用数据库来实现这一点。如何设置,或存储等级。显然,我不能用你的“排名”保存一个字段,因为如果你赢了,它必须编辑数据库中低于你的每个玩家的排名,不是吗 任何想法都会有帮助。因为您描述的“排名”不是基于任何其他规则,例如分数。。一些可以计算的东西,你必须在任何地方存储这个等级 是的,这确实
任何想法都会有帮助。因为您描述的“排名”不是基于任何其他规则,例如分数。。一些可以计算的东西,你必须在任何地方存储这个等级 是的,这确实意味着你每次都需要更新一大堆记录;但由于您提到您最多只能挑战5个职位,这也意味着您每次只需更新6条记录。。(没什么大不了的)
我建议您保留一个排名字段,并放松查询中的瓶颈: 在您的示例中,使用
UPDATE players
SET rank=IF(playerid=<id-of-challengin-player>,rank-5,rank+1)
WHERE rank>=85 AND rank<=90
它看起来像您想要的,但使用单个查询,可以利用索引,只涉及6行
编辑
为了便于维护(固定列号,如果有孔等),运行
一次,然后使用
UPDATE (SELECT @newrank:=0) AS init, players_by_rank
SET score=(@newrank:=@newrank+1)
填补表格中的空白。注意,这涉及到所有行 您确实可以在数据库中有一个排名列,并按照以下行进行更新:
更新您的表集playerRank=playerRank+1,其中playerRank>85
然后将获胜的玩家更新为playerRank 85。这可能会影响很多记录,但不会对数据库造成太大的成本。对不起,我不想复制。。。我在写我的答案时,你提交了你的签名,我没有意识到它只会更新6,我错误地认为它必须编辑你下面的所有级别。如果一条记录也被删除,那会把事情搞砸:你通常不会真的删除记录(一开始),而是设置一个字段,比如SET active=0
。然后运行updateplayers SET rank=IF(playerid=[id of deleted player],-1*rank,rank-1),其中rank>[rank of deleted player]
,这会将您删除的玩家置于无效的排名,您可以在不造成伤害的情况下将其删除。我正在考虑一个查询,如果排名中存在任何差距,它会对所有字段进行排序。或者,这也是一种可能性:创建一次“按等级查看玩家”作为“从按等级排序的玩家中选择*”,然后使用更新(选择@newrank:=0)作为初始,玩家按等级设置分数=(@newrank:=@newrank+1)代码>以缩小表中的间隙。注意,这涉及到所有行!
old new
85 86
86 87
87 88
88 89
89 90
90 85
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)