LoginSignup
50

More than 5 years have passed since last update.

ランキングで同率順位を加味した順位を取得するロジック

Last updated at Posted at 2013-07-05

ランキング実装で順位を求める際、「スコア順に降順ソートして何件目にあるか」とかで順位を求めがちだけど、それでは同率順位までは加味できない。
そこで、同率順位も加味できる簡単なロジックがあったのでメモしておきます。

テーブル(例)

row member score
1 user1 200
2 user2 100
3 user3 300
4 user4 200
5 user5 400

処理の流れ

  1. 自分のスコアを取得する
  2. 自分のスコア以上の件数をカウントする
  3. 自分のスコア以上の件数に+1する

Redisで書く

  1. redis> zscore ranking_key user1 -> 200
    ソート済セット型でキー「ranking_key」のメンバー「user1」のスコアを検索、結果200

  2. redis> zcount key 201 +inf -> 2
    ソート済セット型で 「ranking_key」のスコアが200以上の件数が何件あるかカウントする(200に+1することで200以上とする)、結果2

  3. 2 +1 -> 3
    2で求めた件数に+1することで順位が求められる

コマンド

テストデータ

redis 127.0.0.1:6379> ZADD ranking_key 200 user1
(integer) 1

redis 127.0.0.1:6379> ZADD ranking_key 100 user2
(integer) 1

redis 127.0.0.1:6379> ZADD ranking_key 300 user3
(integer) 1

redis 127.0.0.1:6379> ZADD ranking_key 200 user4
(integer) 1

redis 127.0.0.1:6379> ZADD ranking_key 400 user5
(integer) 1

処理

redis 127.0.0.1:6379> ZSCORE ranking_key user1
"200"

redis 127.0.0.1:6379> ZCOUNT ranking_key 201 +inf
(integer) 2

結果+1が順位

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
50