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

标签 mysql

我正在重新设计一年前为计时器制作的 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/

相关文章:

php - 使用php删除图像文件

MySQL LEFT JOIN 返回空结果集

mysql - 我如何使用 Ebean createSqlQuery 在列表中进行选择

MYSQL反规范化数据查找和删除重复项

c++ - 以编程方式检测表行的更改

java - Java 和 Tomcat 7 的基本数据库连接池

mysql - 我需要帮助在我的 MySQL 数据库中设置外键约束

python - 如何使用 Python 将 NULL 数据插入 MySQL 数据库?

mysql - 如何避免锁定 Insert into..Select

mysql - 与人相匹配的网站数据库设计