2014-03-28 23 views
0

我正在改造我为一个计时器一年前的MySQL数据库。为了给出一些背景知识,它为赛车mod提供了一个计时器,其中包含多个地图,每个地图都有多个阶段。继承人运行表的一个假设的例子查询寻找一个更好的方法在一个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,但是当时间完全相等时这是不可靠的(这是非常常见的)。我认为唯一的解决方案是这样的远远是创建一个列的列,并使用一个存储过程,只是使用光标查询生成上面的表通过incrimentation分配排名,并从那里选择的排名,但这似乎有点过于求助,我试图避免这种情况。那么,我可以如何解决这个问题的任何解决方案/想法?谢谢。如果时间相等,我希望新时间排在旧时间之下,推理是前十名有一个积分系统,并且多次出现相同的排名使系统倾斜。旧的时间通常更令人印象深刻,然后更新的时间相同的值)

或者通过示例使问题更清楚一点,我将如何确定上表中的runID 1952是第4个结果,而不是第三或第五。

+1

请显示您想要的结果样本数据。当时间相等时,你想要发生什么?而且,您正在使用的查询是什么? –

+0

对不起,有点不清楚,我举了一个例子来帮助解释我的意思。 – prmetme

+0

在我看来,你还没有完全定义'排名'的含义。为什么在同一时间做同样事情的两个人有不同的'等级'? –

回答

0

设定在零级可变的,由1的每一行增加它,如果你正在创建一个索引:

SET @rank := 0; 

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

你可以尝试这样的事:

SELECT runid,请用户id,的azazaz ,阶段,时间,日期,(select count(distinct time)+ 1 FROM records r2 WHERE r2.time < r1.time)as rank FROM records r1 ORDER BY rank,date