2015-06-20 75 views
1

我正在制作一款游戏,我需要一个排名系统。我已经用MySQL保存了所有的统计数据,例如杀死,死亡,胜利,无辜的镜头等等。对于我如何能够对每个人进行排名,我一无所知。我想通过MySQL获得它,但它们会很快更新。我以为我可以在游戏开始的时候在HashMap中加载所有的等级,但由于有成千上万的玩家,所以这会非常无效。我也想用大部分统计数据来解决这个问题。有人可以向我解释我将如何做到这一点?谢谢!Java&MySQL-排名

+0

当用户查询排名时,为什么不实时计算排名并将其显示回给用户? – Blip

+0

在同一时间会出现很多游戏,所以我需要使用MySQL,因此没有人获得相同的排名。 – InfIV

+0

为什么不使用* TimeStamp *来声明“的排名为:”。这将消除同一用户有不同等级的问题。 – Blip

回答

0

一种方法是使用mysql事件触发存储过程。存储过程将执行排名并将排名存储在数据库中。然后你可以将事件触发时间设置为任何你想要的,比如10分钟。

MySQL的事件:https://dev.mysql.com/doc/refman/5.7/en/events.html

CREATE 
    [DEFINER = { user | CURRENT_USER }] 
    EVENT 
    [IF NOT EXISTS] 
    event_name 
    ON SCHEDULE schedule 
    [ON COMPLETION [NOT] PRESERVE] 
    [ENABLE | DISABLE | DISABLE ON SLAVE] 
    [COMMENT 'comment'] 
    DO event_body; 
schedule: 
    AT timestamp [+ INTERVAL interval] ... 
    | EVERY interval 
    [STARTS timestamp [+ INTERVAL interval] ...] 
    [ENDS timestamp [+ INTERVAL interval] ...] 

interval: 
    quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | 
       WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | 
       DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND} 

然后你会设置一个存储过程,生成排名,并将其设置为你的球员:https://dev.mysql.com/doc/refman/5.7/en/stored-programs-views.html

的一个示例过程将是:

CREATE PROCEDURE simpleproc (OUT param1 INT) 
    BEGIN 
     SELECT COUNT(*) INTO param1 FROM t; 
    END 

您可以根据需要使程序尽可能复杂。