Mysql 查找用户的排名';s的最低圈速
我有很多赛车手,他们在不同的赛道上比赛。我想得到他们在每条特定赛道上的最佳圈速,并将其与其他用户在该特定赛道上的最佳圈速进行排名。我想为所有轨道上的所有用户执行此操作。所以我想返回一个大型排行榜 基本上,如果我有10名赛车手,他们每个人都在赛道1上完成了25圈,我只想确定每个赛车手的最佳圈速,并在每个赛道上对这些圈速进行排名 我想我差不多有了它,请参见下面的查询和SQLFiddle链接: 为了确保您拥有所有的片段,还有一个“tracks.verified”列。这将确定是否已验证轨迹。你真的不需要担心这个参数,如果你想的话,可以省略它。我指的是这一行:Mysql 查找用户的排名';s的最低圈速,mysql,sql,database,join,Mysql,Sql,Database,Join,我有很多赛车手,他们在不同的赛道上比赛。我想得到他们在每条特定赛道上的最佳圈速,并将其与其他用户在该特定赛道上的最佳圈速进行排名。我想为所有轨道上的所有用户执行此操作。所以我想返回一个大型排行榜 基本上,如果我有10名赛车手,他们每个人都在赛道1上完成了25圈,我只想确定每个赛车手的最佳圈速,并在每个赛道上对这些圈速进行排名 我想我差不多有了它,请参见下面的查询和SQLFiddle链接: 为了确保您拥有所有的片段,还有一个“tracks.verified”列。这将确定是否已验证轨迹。你真的不需要
AND s1.track_id IN (SELECT id FROM tracks WHERE verified=1)
这将产生:
+----------+---------+------------------+------+
| track_id | user_id | duration | rank |
+----------+---------+------------------+------+
| 15 | 2 | 71001.5129995350 | 1 |
| 15 | 1 | 75001.5129995350 | 2 |
| 17 | 1 | 90258.1180334090 | 3 |
| 17 | 2 | 90897.0659971240 | 4 |
+----------+---------+------------------+------+
问题在于它的排名是相互对立的,而不是每一条赛道都是对立的。这些结果应该如下所示:
+----------+---------+------------------+------+
| track_id | user_id | duration | rank |
+----------+---------+------------------+------+
| 15 | 2 | 71001.5129995350 | 1 |
| 15 | 1 | 75001.5129995350 | 2 |
| 17 | 1 | 90258.1180334090 | 1 |
| 17 | 2 | 90897.0659971240 | 2 |
+----------+---------+------------------+------+
我认为这条线就是问题所在:
AND s1.track_id IN (SELECT id FROM tracks WHERE verified=1)
因为如果我将s1.track_id=15(例如),这与单声道的预期效果一样。只是不是全部
感谢您的帮助
编辑:
我正在尝试按用户id筛选结果。因此,我将整个查询放入子查询中。有没有办法不把它放到子查询中就可以做到这一点?谢谢
select track_id, user_id, duration, rank from (SELECT track_id, user_id,duration,
CASE WHEN track_id!=@track THEN @rank:=0 END as reset,
@rank := @rank + 1 AS rank,
@track:=track_id
FROM
(
SELECT DISTINCT s1.track_id, s1.user_id, s1.duration
FROM session_lap_times s1
LEFT JOIN session_lap_times s2
ON s1.user_id=s2.user_id
AND s1.track_id = s2.track_id
AND s1.duration > s2.duration
WHERE s2.duration IS NULL
AND s1.track_id IN (SELECT id FROM tracks WHERE verified=1)
ORDER BY s1.duration ASC
) zz, (SELECT @rank := 0, @track := null) z) as x where user_id=1
至于计算司机总数,我得到了:
SELECT track_id, COUNT(user_id) FROM (SELECT track_id,user_id FROM session_lap_times GROUP BY track_id,user_id) as z GROUP BY track_id
再说一次,没有子查询还有更好的方法吗?谢谢!:)
用你的小提琴测试
引入一个附加变量,并在
跟踪id
更改上重置秩
,我发现您的SQL令人困惑。我会使用分组方式
SELECT track_id, user_id, MIN(duration) as best_time
FROM session_lap_times
GROUP BY track_id, user_id
ORDER BY track_id, best_time;
哦,哇。令人惊叹的!!是否也可以获得一个返回的秩“out”值?总共有多少车手在那条赛道上比赛过?所以我可以在我的应用程序中显示这样的内容:在2000名司机中排名第一?让我知道在同一个查询中这样做是否合适,它是否应该有自己的查询。经过进一步思考,我认为在单独的查询中这样做可能更容易。然后在我的应用程序代码中匹配结果。你知道有一个查询可以做到这一点吗?谢谢在您发布的原始查询中,是否有方法按用户id筛选结果?因此,例如,用户标识1在轨道标识17处应该有排名1,在轨道标识15处应该有排名2。是的。应该有适当的ORDER BY来定义顺序,然后可以计算排名。嘿,原来查询并没有完全解决这个问题。当我添加更多样本数据时,它会重置排名。你能看一下吗?我将在一分钟内创建一个新的stackoverflow问题,以便您可以获得更多分数!
SELECT track_id, user_id, duration,
CASE WHEN track_id!=@track THEN @rank:=0 END as reset,
@rank := @rank + 1 AS rank,
@track:=track_id
FROM
(
SELECT DISTINCT s1.track_id, s1.user_id, s1.duration
FROM session_lap_times s1
LEFT JOIN session_lap_times s2
ON s1.user_id=s2.user_id
AND s1.track_id = s2.track_id
AND s1.duration > s2.duration
WHERE s2.duration IS NULL
AND s1.track_id IN (SELECT id FROM tracks WHERE verified=1)
ORDER BY s1.duration ASC
) zz, (SELECT @rank := 0, @track := null) z;
SELECT track_id, user_id, MIN(duration) as best_time
FROM session_lap_times
GROUP BY track_id, user_id
ORDER BY track_id, best_time;