不相关字段不在此列出

赛局ID - BIGINT

赛道 - INTEGER

赛局ID - BIGINT

车手 - VARCHAR

成绩(毫秒) - INTEGER

从表中数据可以看到,小明同学10赛道的最佳排名是第2,在11赛道的最佳排名是第1,所以小明在所有赛道的最佳排名应该是第1。

SELECT  b.赛道, a.车手, min(a.成绩) AS 成绩FROM 成绩表 a, 赛局表 bWHERE a.赛局ID = b.赛局ID  AND b.赛道 = 10GROUP BY a.车手ORDER BY 成绩 ASC为什么group by 车手?因为一个车手在一个赛道中可能跑了N多个成绩,我们只取最好的那个成绩。

9101112131415SELECT  @排名 := @排名 + 1 AS 排名,  c.赛道,  c.车手,  c.成绩FROM  (    SELECT      b.赛道, a.车手, min(a.成绩) AS 成绩    FROM 成绩表 a, 赛局表 b    WHERE a.赛局ID = b.赛局ID          AND b.赛道 = 10    GROUP BY a.车手    ORDER BY 成绩 ASC  ) c, (SELECT @排名 := 1) d在MySQL中,@变量名 := 值,是一个赋值语句。

SELECT  b.赛道, a.车手, min(a.成绩) AS 成绩FROM 成绩表 a, 赛局表 bWHERE a.赛局ID = b.赛局ID      AND b.赛道 = 10GROUP BY a.车手, b.赛道ORDER BY b.赛道 ASC, 成绩 ASC4. 查询所有赛道各车手的排名89101112131415SELECT  if(@上一个赛道 = c.赛道, @排名 := @排名 + 1, @排名 := 1) AS 排名,  (@上一个赛道 := c.赛道) AS 赛道,  c.车手,  c.成绩FROM  (    SELECT      b.赛道, a.车手, min(a.成绩) AS 成绩    FROM 成绩表 a, 赛局表 b    WHERE a.赛局ID = b.赛局ID          AND b.赛道 = 10    GROUP BY a.车手, b.赛道    ORDER BY b.赛道 ASC, 成绩 ASC  ) c, (SELECT @排名 := 1, @上一个赛道 := 0) d变量@上一个赛道的作用是:当变换赛道时排名要从1重新计算。

910111213141516SELECT  if(@上一个赛道 = c.赛道, @排名 := @排名 + 1, @排名 := 1) AS 排名,  (@上一个赛道 := c.赛道) AS 赛道,  c.车手,  c.成绩FROM  (    SELECT      b.赛道, a.车手, min(a.成绩) AS 成绩    FROM 成绩表 a, 赛局表 b    WHERE a.赛局ID = b.赛局ID          AND b.赛道 = 10    GROUP BY a.车手, b.赛道    ORDER BY b.赛道 ASC, 成绩 ASC  ) c, (SELECT @排名 := 1, @上一个赛道 := 0) dWHERE c.车手 = '小明'6. 查询小明所有赛道的最佳排名(目标达到)9101112131415161718SELECT  if(@上一个赛道 = c.赛道, @排名 := @排名 + 1, @排名 := 1) AS 排名,  (@上一个赛道 := c.赛道) AS 赛道,  c.车手,  c.成绩FROM  (    SELECT      b.赛道, a.车手, min(a.成绩) AS 成绩    FROM 成绩表 a, 赛局表 b    WHERE a.赛局ID = b.赛局ID          AND b.赛道 = 10    GROUP BY a.车手, b.赛道    ORDER BY b.赛道 ASC, 成绩 ASC  ) c, (SELECT @排名 := 1, @上一个赛道 := 0) dWHERE c.车手 = '小明'ORDER BY 排名 ASCLIMIT 1索引赛局表的赛道字段需要加个索引,成绩表的成绩字段需要加个索引,车手字段不需要加索引。