我们有一个游戏,玩家在地图上奔跑,并为此得分。我们需要找出哪些尝试在每张地图上得分最高,并将其isHighScore
标志设置为 true。每张地图只有一次尝试可以获得高分 - 如果两次尝试得分相同,则只有按时间顺序最先出现的尝试才应isHighScore
设置其标志。
我们目前拥有的 SQL 如下所示:
UPDATE attempts AS A1
SET isHighScore = 1
WHERE A1.ID =
(
SELECT A2.ID
FROM (SELECT ID, score, mapID, `date` FROM attempts) AS A2
WHERE A2.mapID = A1.mapID
ORDER BY A2.score DESC, A2.date ASC
LIMIT 1
)
((SELECT ... FROM attempts)
子查询是由于这个问题)
在大约 75k 条目的表上运行上述操作所需的时间比超时时间要长(是的,在 上有一个索引mapID, score, date
)。我认为这是因为最里面的查询将整个attempts
表复制到一个临时表,但是将WHERE mapID = A1.mapID
条件移动到该查询中会产生语法错误,所以我不知道该怎么做。此外,内部查询为每一行运行一次 - 也许有办法解决这个问题?
有谁知道在 MySQL 中编写此查询的更好方法?