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?

Rank新しいスコアが挿入されたときに、すべてのレコードを並べ替えて各レコードをループしてランクを更新することにより、 for a を再計算するGameIDことは問題なく動作しますが、すべてのレコードをループし、すべてのレコードに対して更新クエリを実行すると、何千ものレコードがある場合に速度が低下します。人気のあるゲーム (特に、1 人のユーザーが約 3 秒ごとに新しいスコアを投稿する高速ゲーム) の場合、これはコストがかかりすぎます。

新しいスコア レコードが与えられた場合、それをどの位置に挿入する必要があるかを判断する必要があります。新しいレコードがランクになる場合45、それより上のすべてのレコードを 1 ずつインクリメントできます。これははるかに安価な操作です。

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

私が抱えている問題は、挿入するレコードのレコードのランクを計算することです。単独でScoreもかなり簡単ですが、両方の組み合わせとしてMilliseconds正しいものを発見させるのに苦労しています。Rank

ゲームのスコア レコードの数は既知の値です。

4

1 に答える 1