スコアに基づいてユーザーのランクを格納しようとしています。それはすべて1つのテーブルであり、ネクタイがある場合はランクをスキップします。たとえば:シンプルなMySQLアップデートの結び付きとの関係
ID Score Rank
2 23 1
4 17 2
1 17 2
5 10 4
3 2 5
ユーザーのスコアが更新されるたびに、テーブル全体のためのランクはまた、スコアを更新した後、次のクエリが実行されるので、更新する必要があります。
SET @rank=0;
UPDATE users SET rank= @rank:= (@rank+1) ORDER BY score DESC;
しかし、このその関係で、ネクタイをサポートしていないか、ネクタイをスキップしています。
私はできるだけ少ないクエリで、またジョインはしないで(時間がかかるように)、この再ランキングを実現したいと思います。
私は2つの列追加することによって、望ましい結果を得ることができた - 次のコードで - last_scoreとtie_build_upを:私はそれらの余分な列を望んでいないが、私は単一を取得できませんでした
SET @rank=0, @last_score = null, @tie_build_up = 0;
UPDATE users SET
rank= @rank:= if(@last_score = score, @rank, @[email protected]_build_up+1),
tie_build_up= @tie_build_up:= if(@last_score = score, @tie_build_up+1, 0),
last_score= @last_score:= score, ORDER BY score DESC;
それらなしで動作するようにクエリ。
アイデア?
ありがとうございました。
+1、それは私がしているものです。絶対に必要な場合を除き、計算カラムを格納するのは正しいとは思われません。書き込みのためにロックが必要ないので、列の計算のパフォーマンスはおそらく格納よりも優れています。 –