在mysql查询上寻找更好的方法来确定查询的排名

时间:2014-03-28 19:17:01

标签: mysql

我正在修改一年前为计时器制作的mysql数据库。为了给出一些背景知识,它是一个赛车模型的计时器,它包含多个地图,每个地图都有多个阶段。下面是运行查询的表的一个假设示例

SELECT SELECT *
FROM `records`
WHERE mapid = 3
AND stage = 1
ORDER BY TIME, DATE;

Records
-------------------------------------------------------------------
runId|userId |mapId|stage|  time | date 
3245 |  570  | 3   |  1  | 22.559|5/6/2013
4246 |  59   | 3   |  1  | 22.603|1/2/2014
1752 |  12   | 3   |  1  | 22.612|3/3/2013
1952 |  991  | 3   |  1  | 22.612|3/4/2013
1969 |  13   | 3   |  1  | 22.612|3/8/2013
4569 |  915  | 3   |  1  | 22.620|3/9/2014
-------------------------------------------------------------------

我想要达到的目标是能够确定该特定课程的舞台用户等级,这有点困难。我一直使用的旧方法只是选择小于或等于用户时间的COUNT次,但是当时间完全相等时停止可靠(这是非常常见的。)我想到的唯一解决方案是这样的far正在创建一个rank列,并使用一个存储过程,只是使用游标为查询生成上面的表,通过incrimentation分配排名,只是从那里选择排名,但这似乎有点过时了,而我正试图避免这种情况。那么,关于我如何处理这个问题的任何解决方案/想法?谢谢。

(如果时间相同,我希望新时间排在旧时间之下。这样做的原因是前十名有一个点数系统,并且同一级别的多次倾斜系统。较旧的时间通常比具有相同价值的新时间更令人印象深刻)

或者通过示例使问题更加清晰,我如何确定上表中的runID 1952是第4个结果,而不是第3个或第5个结果。

2 个答案:

答案 0 :(得分:0)

将rank变量设置为零,并为每行增加1,就像创建索引一样:

SET @rank := 0;

SELECT *, @rank := @rank + 1 `rank`
FROM records
WHERE mapid = 3
AND stage = 1
ORDER BY time, date;

答案 1 :(得分:0)

您可以尝试这样的事情:

SELECT runId,userId,mapId,stage,time,date,(select count(distinct time)+ 1 FROM records r2 WHERE r2.time< r1.time)as rank FROM records r1 ORDER BY rank,date