Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
50
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@HirokiTakaba

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

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

テーブル(例)

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が順位

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
50
Help us understand the problem. What are the problem?