例えばデータベースのテーブル上に、
- 成績とかの点数、
- ゲームとかのスコア、
- スポーツの得点、、、
みたいに 順位の優劣があるレコードを使うこと ってありますよね?
ここでは、その順位番号を MySQL から取得する方法についてまとめました。
意外と簡単な方法だったので、いろんな場面で使えるはずです。
今回用意したデータ(テーブル)とやりたいこと
今回は テスト用テーブル を用意してみました。
そのテーブルを元に、順位番号を割り振る方法を解説します。
ではまず、次のSQLを発行してテーブルとレコード挿入
1 2 3 4 5 6 7 8 9 10 11 12 13 |
CREATE TABLE player( id INT KEY AUTO_INCREMENT, name VARCHAR(255), score INT ); INSERT INTO player(name, score) VALUES('hoge',128512); INSERT INTO player(name, score) VALUES('fuga',256); INSERT INTO player(name, score) VALUES('piyo',1632); INSERT INTO player(name, score) VALUES('foobar',2048); INSERT INTO player(name, score) VALUES('quux',1024); SELECT * FROM player; |
テーブルの構造は、
- プライマリー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関数ですね。
- FIND_IN_SET(str,strlist)
コンマで区切られた文字列リスト strlist から最初に str が出現する位置を返す
リファレンスページ :
https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_find-in-set - GROUP_CONCAT(expr)
SELECT文などで選択されたレコードをコンマで連結した文字列を返す
リファレンスページ :
https://dev.mysql.com/doc/refman/5.6/ja/group-by-functions.html#function_group-concat
関数の詳しい説明とかはしないので、詳しくは各リファレンスページを参照
この2つの関数を上手く使えば、順位番号を取得することができます。
例えば今回用意したテーブルにおいて、
スコアに応じた順位番号を取得するには次SQLを発行すればOK
1 2 3 4 5 6 7 8 9 |
SELECT id, name, score, FIND_IN_SET( score, ( SELECT GROUP_CONCAT( score ORDER BY score DESC ) FROM player ) ) AS rank FROM player; |
何やら複雑に見えますが、やってることは結構単純です。
- まず 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でランキングの順位番号を取得する方法でした。ではではバイバイ(^^)/~~~