0

给定表格:

ArcadeScores
------------
ID
GameID
UserID
Score
Milliseconds
Rank

哪里Rank> 0 并计算为Score DESC then by Milliseconds ASC(最好的分数总是最高的,如果分数相同,它由最快的人排名)。

存储Rank是必需的,因为它允许我执行快速查询,例如How many top 3 scores does userID 5 have?.

当通过对所有记录进行排序并循环每个记录更新排名来重新计算Rankfor aGameID时,可以正常工作,但是当您有数千条记录时,遍历每条记录并对每条记录执行更新查询会减慢速度。对于流行的游戏(尤其是单个用户可能每 3 秒左右发布一个新分数的快速游戏),这太昂贵了。

给定一个新的分数记录,我需要确定它应该插入到哪个位置。如果我们的新记录要排名45,我们可以将它上面的每条记录增加一个,这是一个便宜得多的操作:

UPDATE ArcadeScores SET ScoreRank = ScoreRank + 1 WHERE gameID = " + myGameID + " AND ScoreRank >= 45

我遇到的困难是计算要插入的记录的记录等级。Score单独或单独它相当容易,但我Milliseconds正在努力让它发现正确Rank的两者结合。

一场比赛有多少得分记录是一个已知值。

4

1 回答 1

1

您需要查询还是可以使用函数?试试这个查询 - 如果我正确理解了你表中的顺序,它将为新行提供一个排名,其值为 inserting_score 和 inserting_milliseconds:

SELECT COUNT(1) + 1 FROM ArcadeScores 
WHERE Score > inserting_score OR (Score = inserting_score AND Milliseconds < inserting_millisecondes)

哦,忘了GameID :)

SELECT COUNT(1) + 1 FROM ArcadeScores 
WHERE GameID = inserting_gameid AND (Score > inserting_score 
OR (Score = inserting_score AND Milliseconds < inserting_millisecondes))
于 2013-07-01T16:12:14.093 回答