在MySQL表中获取行的位置

时间:2013-01-20 20:02:28

标签: mysql

我有一张桌子,用于存储赛车锦标赛的积分数据。问题是 - 我实际上并没有存储驱动程序的位置,但我只是存储点数和其他数据(获胜次数等),然后让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季的位置。如果我只是想知道车手(例如“维特尔”)的位置,我该怎么办?我已经尝试了所有我能想到的东西,但没有用。

3 个答案:

答案 0 :(得分: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列表,以便您可以识别每条记录)。

答案 1 :(得分:0)

选择点数大于该驾驶员积分的点数。这在第二次查询中是最容易的,但是存在竞争条件的可能性(没有双关语意)。

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

答案 2 :(得分:0)

你真的应该将评论中提到的位置明确地保存到你原来的帖子中。它会使围绕这个问题的所有代码更清晰。

应该可以填充值,以便使用inert...select

在示例中填充当前行的新驱动程序位置字段

但是你也可以使用子查询

来低效地获取相同的信息