Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 排名系统的数据库结构_Php_Database - Fatal编程技术网

Php 排名系统的数据库结构

Php 排名系统的数据库结构,php,database,Php,Database,我正在制作一个PHP战斗系统,需要整理排名 我想让它工作的方式是假设有100名球员,而你的排名是90。你可以挑战5级以上的玩家,所以假设你挑战并击败85级的玩家,那么你变成85级,他变成86级 不过,我不知道如何使用数据库来实现这一点。如何设置,或存储等级。显然,我不能用你的“排名”保存一个字段,因为如果你赢了,它必须编辑数据库中低于你的每个玩家的排名,不是吗 任何想法都会有帮助。因为您描述的“排名”不是基于任何其他规则,例如分数。。一些可以计算的东西,你必须在任何地方存储这个等级 是的,这确实

我正在制作一个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)