2013-07-01 25 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

非常感謝你!完全從錯誤的角度去做,你的方式很棒! –