假设我有以下分数表(总行 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-5的结果
- 如果用户排在第6位,他会得到第4-9名的结果
- 如果用户排在第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/