2013-07-01 28 views
0

鉴于表:找到正确的位置插入新的HI-得分纪录

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?

重新计算Rank为当一个新的得分是通过订购的所有记录,循环每一个更新秩工程确定,而是通过每个记录循环和每个记录上执行更新查询插入GameID减慢,当你有几千的记录。对于一款流行的游戏(特别是一个快速的游戏,其中一个用户可能每隔3秒发布一个新的分数),这太昂贵了。

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

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

我在正在制定的一个记录的等级难度记录插入。仅在ScoreMilliseconds单独它很容易,但我努力使它发现正确的Rank作为两者的组合。

游戏中有多少分数记录是已知的值。

回答

1

你需要查询还是可以使用函数?试试这个查询 - 如果我在你的餐桌理解正确顺序,它会给新行的秩与价值观inserting_score和inserting_milliseconds:

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

哦,忘了游戏ID :)

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

非常感谢你!完全从错误的角度去做,你的方式很棒! –