MySQL5.7 でも順位を付けたい

MySQLDBMSとして使用している環境において、取得結果をカラムの値で順位付けしたいことがあると思います。

バージョンが 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

参考

www.shoeisha.co.jp