我正在重新设计一年前为计时器制作的 mysql 数据库。为了提供一些背景知识,它是一个赛车模组的计时器,其中包含多个 map ,每个 map 内都有多个阶段。这是运行查询的表的假设示例
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
-------------------------------------------------------------------
我想要实现的是能够确定该特定类(class)阶段的用户排名,这有点困难。我一直在使用的旧方法只是选择小于或等于用户时间的次数,但是当时间完全相等时,这种方法就不再可靠了(这非常常见。)我想到的唯一解决方案是远正在创建一个排名列,并使用存储过程,并且仅使用游标进行查询来生成上面的表以通过增量分配排名,然后从那里选择排名,但这似乎有点太最后了,我正在努力避免这种情况。那么,关于如何解决这个问题有什么解决方案/想法吗?谢谢。
(此外,如果时间相等,我希望较新的时间排名低于较旧的时间。这样做的原因是前 10 名有一个积分系统,并且多次相同的排名会扭曲系统。另外较旧的时间通常比相同值的较新时间更令人印象深刻)
或者通过示例使问题更清楚,我如何确定上表中的 runID 1952 是第四个结果,而不是第三个或第五个结果。
最佳答案
将排名变量设置为零,并为每行将其增加 1,就像创建索引一样:
SET @rank := 0;
SELECT *, @rank := @rank + 1 `rank`
FROM records
WHERE mapid = 3
AND stage = 1
ORDER BY time, date;
关于mysql - 在 mysql 查询上寻找更好的方法来确定查询的排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22721352/