我正在重新处理一年前为定时器创建的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
-------------------------------------------------------------------
我想要实现的是能够在特定的课程中确定用户的排名,这有点困难。我一直使用的旧方法只是选择少于或等于用户时间的次数,但是,当时间完全相等时,这就不再是可靠的了(这是非常普遍的)。到目前为止,我想出的唯一解决方案是创建一个秩列,并使用一个存储过程,只需要使用一个游标来生成上面的表,通过输入来分配级别,并从其中选择级别,但这似乎有点太晚了,我试图避免这种情况。那么,对于我如何处理这个问题,有什么解决方案/想法吗?谢谢。
(同样,如果时间是相等的,我希望更新的时间被排在旧的时间之下。这样做的理由是,前10名有一个积分系统,而同一等级多次使系统倾斜。同样,较老的时间通常比价值相同的较新的时间更令人印象深刻)
或者让这个问题更清晰一些,我如何确定上面提到的1952年的runID是第四个结果,而不是第三个或第五个。
发布于 2014-03-28 11:36:42
将秩变量设置为零,并为每行增加1,就好像要创建索引一样:
SET @rank := 0;
SELECT *, @rank := @rank + 1 `rank`
FROM records
WHERE mapid = 3
AND stage = 1
ORDER BY time, date;
发布于 2014-03-28 12:16:04
你可以试试这样的方法:
从记录中选择runId、userId、mapId、stage、time、date (从记录r2中选择count(不同时间)+1,其中r2时间< r1.time)作为记录中的等级,按等级、日期排列r1顺序
https://stackoverflow.com/questions/22721352
复制相似问题