mysql:根据特定用户返回分数等级的查询

mysql:根据特定用户返回分数等级的查询,mysql,query-optimization,Mysql,Query Optimization,假设我有下面的分数表(共10行): 用户可以获取其得分状态,并且可以在其位置周围获得5个得分位置。 这意味着: 如果用户排名第一,他将获得排名1-5的结果 如果用户排名第6位,他将获得排名4-9的结果 如果用户排在第9位,他将得到排名6-10的结果 我试图找到最优化的方法来执行这些操作,以便仅在SQL中获取用户的分数状态,而不使用其他语言集成 非常感谢 更新 此表实际上是动态创建的 我有一个带有gameid、userid、time和logid(即playid)的game_日志表 我有一个带有lo

假设我有下面的分数表(共10行):

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

  • 如果用户排名第一,他将获得排名1-5的结果
  • 如果用户排名第6位,他将获得排名4-9的结果
  • 如果用户排在第9位,他将得到排名6-10的结果
  • 我试图找到最优化的方法来执行这些操作,以便仅在SQL中获取用户的分数状态,而不使用其他语言集成

    非常感谢

    更新 此表实际上是动态创建的

    我有一个带有gameid、userid、time和logid(即playid)的game_日志表 我有一个带有logid和score的game_分数表

    我使用以下查询:

    @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
    

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

    因此,通过一个查询获得用户的排名可能更有意义,用源编程语言计算您想要获得的限制(这里处理边缘情况比用SQL容易得多),然后发出一个简单的查询,用它来获取所需的数据

    例如,一旦您按照上述方式计算了“startRank”,您只需使用:

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


    更新:既然你已经透露排名是动态计算的,那么这就没什么意义了,但是我提出的一般观点仍然有效——在编程语言中处理诸如初始和最终位置之类的边缘情况要比在SQL中容易得多。

    上面的表有多少是通过查询动态生成的?i、 e:表中真的有“排名”字段吗?还是这是动态生成的?排名是动态生成的。我将编辑主要帖子来添加这些信息实际上我已经在使用你在这里提供的解决方案了。我首先计算用户的排名,然后获取相关行。我试图找出是否有一种更优化的方法。如果结果SQL不是那么痛苦,以至于如果你需要进一步调整的话,它会成为维护的噩梦,我会感到惊讶。也就是说,希望有人能证明这一点。:-)我知道在编程语言中这样做比在mysql中更容易,问题是为了这样做,我需要获取所有行来计算它们,这可能是一个很长的表。
    SELECT * FROM table_name WHERE rank >= startRank ORDER BY rank ASC LIMIT 5;