mysql:查询根据特定用户返回分数排名

时间:2010-01-17 12:40:21

标签: mysql query-optimization

假设我有以下分数表(总行数为10):

rank userid score
---- ------ -----
 1   |455   |10
 2   |435   |9
 3   |354   |8
 4   |342   |7
 5   |343   |6
 6   |123   |5
 7   |125   |4
 8   |128   |3
 9   |5     |2
10   |6     |1

用户可以获取他的分数状态,并且他可以在他的位置获得5个分数位置。 这意味着:

  1. 如果用户位于第1位,他将获得排名1-5的结果
  2. 如果用户位于第6位,他将获得排名4-9
  3. 的结果
  4. 如果用户位于第9位,他将获得排名6-10
  5. 的结果

    我正在尝试找到最优化的方法来执行这些操作,以便仅在SQL中获取用户的分数状态,而不是其他语言集成。

    非常感谢!!!

    更新

    这个表实际上是在运行中创建的

    我有一个game_log表,其中包含gameid,userid和time以及logid(这是playid) 我有game_score表与logid和得分。

    我使用以下查询:

    @rank:=0;
    
    select @rank:=@rank+1 as rank,userid,score from (
    select * from (
       select game_log_gameid as gameid,
       game_log_userid as userid,
    (select max(game_score_log_score)
            from game_score_log where game_score_log_logid=game_log_id) as score,
            (select game_score_log_timestamp as time from
                game_score_log where game_score_log_logid=game_log_id and
                game_score_log_score = score order by game_score_log_timestamp desc)
                as time from game_log
    where game_log_gameid=620
    order by score desc,time
    ) as a group by gameid,userid ) as b order by score desc,time
    

1 个答案:

答案 0 :(得分:1)

我不确定尝试在单个查询中完成所有这些操作是非常有意义的,因为您需要一个子选择或类似的东西来获得用户的排名,然后您可以计算限制。

因此,使用单个查询获取用户排名可能更有意义,计算您希望在源编程语言中获得的限制(处理边缘情况将比SQL中容易得多)然后发布使用LIMIT获取所需数据的简单查询。

例如,如上所述计算'startRank'后,您只需使用:

SELECT * FROM table_name WHERE rank >= startRank ORDER BY rank ASC LIMIT 5;

更新:由于您已经发现排名是动态计算的,所以这并没有多大意义,但我所做的一般观点仍然有效 - 处理边缘情况,例如initial &安培;在编程语言中,最终位置将比在SQL中容易得多。