假设我有以下分数表(共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中获得用户的评分状态,而不是其他语言集成。
非常感谢!
更新
这个表实际上是动态创建的。
我有一个带有gameid、userid和time和logid的game_log表(这是playid),还有带有logid和score的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发布于 2010-01-17 12:56:58
我不确定在一个查询中尝试这样做有多大的意义,因为您需要一个子选择或类似的东西来获得用户的排名,然后可以计算出周围的限制。
因此,使用单个查询获得用户的排名可能更有意义,计算您希望在源编程语言中获得的限制(在这里处理边缘情况要比在SQL中容易得多),然后发出一个使用限制获取所需数据的简单查询。
例如,一旦您像上面那样计算了'startRank‘,您只需使用:
SELECT * FROM table_name WHERE rank >= startRank ORDER BY rank ASC LIMIT 5;Update:既然您已经发现排名是动态计算的,那么这就没有什么意义了,但是我提出的一般观点仍然有效--在编程语言中处理诸如初始和最终位置这样的边缘情况要比在SQL中容易得多。
https://stackoverflow.com/questions/2080969
复制相似问题