假设我有以下分数表(总行数为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个分数位置。 这意味着:
我正在尝试找到最优化的方法来执行这些操作,以便仅在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
答案 0 :(得分:1)
我不确定尝试在单个查询中完成所有这些操作是非常有意义的,因为您需要一个子选择或类似的东西来获得用户的排名,然后您可以计算限制。
因此,使用单个查询获取用户排名可能更有意义,计算您希望在源编程语言中获得的限制(处理边缘情况将比SQL中容易得多)然后发布使用LIMIT获取所需数据的简单查询。
例如,如上所述计算'startRank'后,您只需使用:
SELECT * FROM table_name WHERE rank >= startRank ORDER BY rank ASC LIMIT 5;
更新:由于您已经发现排名是动态计算的,所以这并没有多大意义,但我所做的一般观点仍然有效 - 处理边缘情况,例如initial &安培;在编程语言中,最终位置将比在SQL中容易得多。