MySQL をDBMSとして使用している環境において、取得結果をカラムの値で順位付けしたいことがあると思います。
バージョンが 8.0 であればウインドウ関数 RANK()
を使用すれば実現できますが、5.7 を使用している場合は別の方法を取る必要があります。
動作確認用のテーブル準備
CREATE TABLE IF NOT EXISTS tbl ( `id` INT AUTO_INCREMENT NOT NULL, `name` VARCHAR(20) NOT NULL, `count` INT NOT NULL, PRIMARY KEY (`id`) );
INSERT INTO tbl(name, count) VALUES('ユーザA', 1), ('ユーザB', 2), ('ユーザC', 2), ('ユーザD', 0), ('ユーザE', 10);
順位を付けて取得
自己非等値結合を使用し、自分よりcountの値が大きいレコードの数を数えて順位を導き出しています。
SELECT tbl.*, (SELECT COUNT(*)+1 FROM tbl AS tmp WHERE tmp.count > tbl.count) AS rank FROM tbl ORDER BY rank;
id | name | count | rank |
---|---|---|---|
5 | ユーザE | 10 | 1 |
2 | ユーザB | 2 | 2 |
3 | ユーザC | 2 | 2 |
1 | ユーザA | 1 | 4 |
4 | ユーザD | 0 | 5 |
同じ順位の値が続いた際に、次の順位を前の順位にレコード数を加算した値にするのではなく、続きの値にする場合は DISTINCT を使用して count の値が同じレコードを1件と数えます。
SELECT tbl.*, (SELECT COUNT(DISTINCT tmp.count)+1 FROM tbl AS tmp WHERE tmp.count > tbl.count) AS rank FROM tbl ORDER BY rank;
id | name | count | rank |
---|---|---|---|
5 | ユーザE | 10 | 1 |
3 | ユーザC | 2 | 2 |
2 | ユーザB | 2 | 2 |
1 | ユーザA | 1 | 3 |
4 | ユーザD | 0 | 4 |