勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ

MySQLのRANK及びDENSE_RANK関数を用いてランキングを実装する方法

ランキング機能を実装する際、上位〇位までのデータをMySQLから持ってきて順位付けはPHP側で行っていた。ただ、MySQL8からはRANK及びDENSE_RANKという関数が実装され、こちらを用いることでMySQLのみで対応できるみたい。以下に対応方法をメモ。

 

リファレンス

RANK

https://dev.mysql.com/doc/refman/8.0/ja/window-function-descriptions.html#function_rank

DENSE_RANK

https://dev.mysql.com/doc/refman/8.0/ja/window-function-descriptions.html#function_dense-rank

 

テーブル情報

テーブル構造

mysql> SHOW COLUMNS FROM `test_table`;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int          | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | NO   |     | NULL    |                |
| score | int          | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

データ内容

mysql> SELECT * FROM `test_table`;
+----+-----------+-------+
| id | name      | score |
+----+-----------+-------+
|  1 | 鈴木      |    50 |
|  2 | 山田      |    60 |
|  3 | 佐々木    |    70 |
|  4 | 佐藤      |    40 |
|  5 | 渡辺      |    60 |
|  6 | 高橋      |    80 |
+----+-----------+-------+

 

実装方法

同率順位があった場合、次の順位は+2とする場合(RANK)

SELECT *, RANK() OVER (ORDER BY `score`) AS `rank` 
FROM `test_table`;

+----+-----------+-------+------+
| id | name      | score | rank |
+----+-----------+-------+------+
|  4 | 佐藤      |    40 |    1 |
|  1 | 鈴木      |    50 |    2 |
|  2 | 山田      |    60 |    3 |
|  5 | 渡辺      |    60 |    3 |
|  3 | 佐々木    |    70 |    5 |
|  6 | 高橋      |    80 |    6 |
+----+-----------+-------+------+

同率順位があっても次の順位は+1とする場合(DENSE_RANK)

SELECT *, DENSE_RANK() OVER (ORDER BY `score`) AS `rank` 
FROM `test_table`;

+----+-----------+-------+------+
| id | name      | score | rank |
+----+-----------+-------+------+
|  4 | 佐藤      |    40 |    1 |
|  1 | 鈴木      |    50 |    2 |
|  2 | 山田      |    60 |    3 |
|  5 | 渡辺      |    60 |    3 |
|  3 | 佐々木    |    70 |    4 |
|  6 | 高橋      |    80 |    5 |
+----+-----------+-------+------+

 - MySQL / MariaDB データベース

  関連記事

MySQLでwhere句を使ってカラム指定でデータをコピーする方法
MySQLでwhere句を使ってカラム指定でデータをコピーする方法

MySQLで大量のデータを保存しているテーブルがあり、そのデータを絞った上で尚且 ...

MySQLでINSERT時にオートインクリメントではないカラムに連番を登録する方法
MySQLでINSERT時にオートインクリメントではないカラムに連番を登録する方法

MySQLでINSERT時にオートインクリメントではないカラムに連番を登録したい ...

MySQLにてUUIDを発行しプライマリキー(主キー)にする方法
MySQLにてUUIDを発行しプライマリキー(主キー)にする方法

普段MySQLでプライマリキー(主キー)を使う場合、オートインクリメントを利用し ...

MySQLで1対多というテーブル構造でデータ結合と条件検索する方法
MySQLで1対多というテーブル構造でデータ結合と条件検索する方法

MySQLで飲食店舗テーブルと休業日テーブルがあり、1店舗に対して複数行の休業日 ...

MySQLでデータベース単位とテーブル単位のデータサイズ(容量)の調べ方
MySQLでデータベース単位とテーブル単位のデータサイズ(容量)の調べ方

VPSの各種ファイルを整理している際に「MySQLも不要なデータを削除すればいい ...