0

我有一张表格,用于存储赛车锦标赛的积分榜数据。问题是 - 我实际上并没有存储驾驶员的位置,但我只是存储了点数以及其他数据(获胜次数等),然后让 MySQL 为我排序。这通常可以正常工作,但如果我想知道某个赛季的车手位置怎么办?我可以使用以下代码:

SELECT  l.driver, @curRow := @curRow + 1 AS position
FROM    driverStandings l
JOIN    (SELECT @curRow := 0) r
WHERE   l.season = 1
ORDER BY l.points DESC, l.racesWon DESC

但是,这将返回每个车手及其在第 1 季中的位置的列表。如果我只想知道一个车手(例如“维特尔”)的位置,我能做什么?我已经尝试了我能想到的一切,但无济于事。

4

3 回答 3

2
SELECT       COUNT(v.id) + 1
FROM         driverStandings d
  LEFT JOIN  driverStandings v
         ON  d.points > v.points
         OR (d.points = v.points AND d.racesWon > v.racesWon)
WHERE        v.id = ?

如果需要,您可以GROUP BY代替过滤v.id(只需记住将其添加到SELECT列表中,以便您可以识别每条记录)。

于 2013-01-20T20:29:58.197 回答
0

在点数大于该驱动程序点的情况下进行选择计数。这在第二个查询中是最简单的,但是有可能出现竞争条件(没有双关语)。

从 driverStandings l 中选择 (count(*) + 1) 作为位置,其中 l.points > :driverPoints

于 2013-01-20T20:08:57.137 回答
0

您确实应该按照对原始帖子的评论中提到的那样明确存储位置。它将使围绕此问题的所有代码更清晰。

应该可以填充这些值,以便新的驱动程序位置字段填充当前行,如您的示例中使用惰性...选择

但是,您也可以使用子查询低效地获取相同的信息

于 2013-01-20T20:18:14.990 回答