Mysql 查找用户的排名';s的最低圈速

Mysql 查找用户的排名';s的最低圈速,mysql,sql,database,join,Mysql,Sql,Database,Join,我有很多赛车手,他们在不同的赛道上比赛。我想得到他们在每条特定赛道上的最佳圈速,并将其与其他用户在该特定赛道上的最佳圈速进行排名。我想为所有轨道上的所有用户执行此操作。所以我想返回一个大型排行榜 基本上,如果我有10名赛车手,他们每个人都在赛道1上完成了25圈,我只想确定每个赛车手的最佳圈速,并在每个赛道上对这些圈速进行排名 我想我差不多有了它,请参见下面的查询和SQLFiddle链接: 为了确保您拥有所有的片段,还有一个“tracks.verified”列。这将确定是否已验证轨迹。你真的不需要

我有很多赛车手,他们在不同的赛道上比赛。我想得到他们在每条特定赛道上的最佳圈速,并将其与其他用户在该特定赛道上的最佳圈速进行排名。我想为所有轨道上的所有用户执行此操作。所以我想返回一个大型排行榜

基本上,如果我有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;