【发布时间】:2012-07-06 18:19:21
【问题描述】:
我正在做一个PHP对战系统,需要整理一下排名。
我希望它的工作方式是假设有 100 名玩家,而您的等级为 90。您可以挑战 5 等级以上的玩家,因此假设您挑战并击败等级为 85 的玩家,然后您变为 85,而他变为 86 .
我不确定如何使用数据库来执行此操作。如何设置它,或存储排名。显然我不能用你的“排名”保存一个字段,因为如果你赢了,它必须编辑数据库中排名低于你的每一个球员,不是吗?
任何想法都会有所帮助。
【问题讨论】:
我正在做一个PHP对战系统,需要整理一下排名。
我希望它的工作方式是假设有 100 名玩家,而您的等级为 90。您可以挑战 5 等级以上的玩家,因此假设您挑战并击败等级为 85 的玩家,然后您变为 85,而他变为 86 .
我不确定如何使用数据库来执行此操作。如何设置它,或存储排名。显然我不能用你的“排名”保存一个字段,因为如果你赢了,它必须编辑数据库中排名低于你的每一个球员,不是吗?
任何想法都会有所帮助。
【问题讨论】:
由于您描述的“排名”不是基于任何其他规则,例如积分..可以计算的东西,您必须在任何地方存储此排名。
是的,这确实意味着您每次都需要更新一大堆记录;但是既然你提到你最多只能挑战你前面的 5 个位置,这也意味着你每次只需要更新 6 条记录..(没什么大不了的)
90 -> 85
89 -> 90
88 -> 89
87 -> 88
86 -> 87
85 -> 86
【讨论】:
我建议你做保留一个排名字段并放松查询中的瓶颈:
在您的示例中使用类似
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)
填补表格中的空白。请注意,这涉及所有行!
【讨论】:
SET active=0。然后您运行UPDATE players SET rank=IF(playerid=[id of deleted player],-1*rank,rank-1) WHERE rank>[rank of deleted player],这会将您删除的播放器置于无效等级,您可以将其删除而不会受到伤害。
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); 填补表格中的空白。请注意,这涉及所有行!
您确实可以在数据库中有一个排名列并按照以下方式更新:update yourtable set playerRank=playerRank+1 where playerRank>85 然后将获胜玩家更新为 playerRank 85。这可能会创下很多记录,但不会太重数据库的成本。
【讨论】: