MySQLでランキングに順位番号を取得する簡単な方法

例えばデータベースのテーブル上に、

  • 成績とかの点数、
  • ゲームとかのスコア、
  • スポーツの得点、、、

みたいに 順位の優劣があるレコードを使うこと ってありますよね?

ここでは、その順位番号を MySQL から取得する方法についてまとめました。

意外と簡単な方法だったので、いろんな場面で使えるはずです。

今回用意したデータ(テーブル)とやりたいこと

今回は テスト用テーブル を用意してみました。

そのテーブルを元に、順位番号を割り振る方法を解説します。

 

ではまず、次のSQLを発行してテーブルとレコード挿入

テーブルの構造は、

  • プライマリーID( id  )
  • プレイヤー名( name  )
  • スコア( score  )

この3つを記録するだけという単純なモノ

今回の目的は「スコアに対応した順位番号を取得すること」です。

 

あとちなみに、
このテーブルで SELECT * FROM player;  をした結果は次の通り

id name score
1 hoge 128512
2 fuga 256
3 piyo 1632
4 foobar 2048
5 quux 1024

このテーブルで順位をつけるなら
スコアが 128512 で一番高い hoge を 1位 にして、
スコアが 256 で一番低い fuga に 5位 という順位番号を割り振りたい・・・

簡単にいうと、そういうことです。

ではその具体的なやり方を次から説明していきます。

実際に順位番号を取得するSQLの書き方例

では今紹介したテーブルを例にして、順位番号を取得するSQLの書き方を詳解

そのために重要になのが、次の2つのMySQL関数ですね。

関数の詳しい説明とかはしないので、詳しくは各リファレンスページを参照

この2つの関数を上手く使えば、順位番号を取得することができます。

 

例えば今回用意したテーブルにおいて、
スコアに応じた順位番号を取得するには次SQLを発行すればOK

何やら複雑に見えますが、やってることは結構単純です。

  • まず GROUP_CONCAT  でスコアを高い順で連結
  • その後 FIND_IN_SET  で各順位を取得
  • その順位を rank  というレコード名で記録

やってることはこれだけ。

このSQLを実行すると、次表みたいになります。

id name score rank
1 hoge 128512 1
2 fuga 256 5
3 piyo 1632 3
4 foobar 2048 2
5 quux 1024 4

赤色で示した rank  列に注目

この各順位とスコアを見比べてみてください。

しっかりとスコア順で順位番号が割り振られてますよね?

 

以上がMySQLで順番号を割り当てる方法

ただし専用関数を使ってるので、MySQLだけでしかできません。

PostgreSQL や SQLite では(多分)できないと思うので、注意してください。

ここまでのまとめ

ここまで紹介したみたいに、順位番号の取得はあまり難しくありません。

ただ関数を多く使うので、その分やり方を思い出すのは少し大変かも・・・

でも色々な場面で応用できるので、かなり便利なテクニックです、

以上、MySQLでランキングの順位番号を取得する方法でした。ではではバイバイ(^^)/~~~

Commentsこの記事についたコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください