MySQL によるランキング管理
CREATE TABLE ranking ( user_id INT UNSIGNED NOT NULL COMMENT "ユーザID", score INT NOT NULL COMMENT "順位付けに使う値", rank INT UNSIGNED NOT NULL COMMENT "順位", PRIMARY KEY (user_id), INDEX USING BTREE (score) );
user_id | score | rank |
---|---|---|
1 | 100 | 0 |
2 | 70 | 0 |
3 | 50 | 0 |
4 | 50 | 0 |
5 | 20 | 0 |
というテーブルがあったとき、
SET @rank = 1, @rownum = 0, @prev = null; UPDATE ranking SET rank = (@rank := IF((@rownum := @rownum + 1) AND (@prev <=> score OR (@prev := score) <=> NULL), @rank, @rownum)) ORDER BY score DESC;
することで
user_id | score | rank |
---|---|---|
1 | 100 | 1 |
2 | 70 | 2 |
3 | 50 | 3 |
4 | 50 | 3 |
5 | 20 | 5 |
となります。
ranking テーブル自体をメモリテーブルにして、 1 分ごとに上クエリを発行していれば、中々最新のデータになるのではないでしょうか。
※もちろん score の元データは別のテーブルでちゃんと記録されてるとして。