【问题标题】:database structure for ranking system排名系统的数据库结构
【发布时间】:2012-07-06 18:19:21
【问题描述】:

我正在做一个PHP对战系统,需要整理一下排名。

我希望它的工作方式是假设有 100 名玩家,而您的等级为 90。您可以挑战 5 等级以上的玩家,因此假设您挑战并击败等级为 85 的玩家,然后您变为 85,而他变为 86 .

我不确定如何使用数据库来执行此操作。如何设置它,或存储排名。显然我不能用你的“排名”保存一个字段,因为如果你赢了,它必须编辑数据库中排名低于你的每一个球员,不是吗?

任何想法都会有所帮助。

【问题讨论】:

    标签: php database


    【解决方案1】:

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

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

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

    【讨论】:

    • 抱歉,我不想抄袭……我正在写我的答案,而你提交了你的答案
    【解决方案2】:

    我建议你保留一个排名字段并放松查询中的瓶颈:

    在您的示例中使用类似

    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)
    

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

    【讨论】:

    • 谢谢,我没有意识到它只会更新6,我错误地认为它必须编辑你下面的所有等级。
    • 如果一条记录也被删除了,那就搞砸了:o
    • 您通常通过不真正删除记录(一开始)来解决此问题,而是设置一个字段,例如SET active=0。然后您运行UPDATE players SET rank=IF(playerid=[id of deleted player],-1*rank,rank-1) WHERE rank&gt;[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); 填补表格中的空白。请注意,这涉及所有行!
    【解决方案3】:

    您确实可以在数据库中有一个排名列并按照以下方式更新:update yourtable set playerRank=playerRank+1 where playerRank&gt;85 然后将获胜玩家更新为 playerRank 85。这可能会创下很多记录,但不会太重数据库的成本。

    【讨论】:

      猜你喜欢
      • 2012-12-03
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多