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

标签 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-5的结果
  2. 如果用户排在第6位,他会得到第4-9名的结果
  3. 如果用户排在第9位,他会得到排名第6-10位的结果

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

非常感谢!!!

更新

这个表实际上是即时创建的

我有一个 game_log 表,其中包含 gameid、userid 和时间以及 logid(即 playid) 我有带有 logid 和分数的 game_score 表。

我使用以下查询:

@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 中容易得多)然后发出使用 LIMIT 的简单查询获取所需数据。

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

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

更新:既然您已经透露排名是动态计算的,那么这并没有多大意义,但我提出的一般观点仍然有效 - 处理边缘情况,例如初始& 最终位置在编程语言中比在 SQL 中容易得多。

关于mysql:查询返回根据特定用户的分数排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2080969/

相关文章:

php - 使用 php 和 mysqli 填充下拉框

mysql - 在 phpmyadmin 中执行多个查询

PHP & MySQL : How can i neglect empty variables from select

mysql - SQL Left Join 多个表并有条件地对每个表中的值进行计数

sql - Access 和 ODBC/Oracle 都能理解的通用 SQL

mysql - 需要对索引进行一些说明(WHERE、JOIN)

php - SQL 优化左外连接查询

mysql - mysql容器内的mysql命令永久挂起

sql - 简单查询优化

mysql - 如何使用 LIMIT 优化 WHERE 子句中的通配符查询