我有一张桌子,用于存储赛车锦标赛的积分数据。问题是 - 我实际上并没有存储驱动程序的位置,但我只是存储点数和其他数据(获胜次数等),然后让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季的位置。如果我只是想知道车手(例如“维特尔”)的位置,我该怎么办?我已经尝试了所有我能想到的东西,但没有用。
答案 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
在示例中填充当前行的新驱动程序位置字段但是你也可以使用子查询
来低效地获取相同的信息