MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで複数のカラムの順位(ランク)を表示するクエリの書き方

MySQLで複数カラムの順位を表示するには?

MySQLで複数のカラムに対してそれぞれ順位(ランク)を表示したい場合は、FIND_IN_SET() 関数と GROUP_CONCAT() 関数を組み合わせることで実現できます。この記事では、実際にテーブルを作成し、点数(Marks)と年齢(Age)の2つのカラムそれぞれに対する順位を取得する方法を、具体例とともに解説します。

1. サンプルテーブルの作成

まず、以下のようにテーブルを作成します。

mysql> create table DemoTable634 (FirstName varchar(100),Marks int,Age int);
Query OK, 0 rows affected (0.69 sec)

2. レコードの挿入

次に、INSERT文を使ってサンプルデータを挿入します。

mysql> insert into DemoTable634 values('John',60,23);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable634 values('Chris',80,21);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable634 values('Robert',70,24);
Query OK, 1 row affected (0.22 sec)

3. テーブルの中身を確認

SELECT文ですべてのレコードを表示して確認しましょう。

mysql> select *from DemoTable634;

実行結果は以下の通りです。

+-----------+-------+------+
| FirstName | Marks | Age  |
+-----------+-------+------+
| John      |    60 |   23 |
| Chris     |    80 |   21 |
| Robert    |    70 |   24 |
+-----------+-------+------+
3 rows in set (0.00 sec)

4. 複数カラムの順位を表示するクエリ

ここが本題です。以下のクエリでは、サブクエリ内で GROUP_CONCAT() を使って各カラムの値を降順に連結した文字列を作成し、FIND_IN_SET() でその中での位置(=順位)を取得しています。

mysql> SELECT FirstName,Marks,Age,
    FIND_IN_SET( Marks,( SELECT GROUP_CONCAT( Marks ORDER BY Marks DESC ) FROM DemoTable634)) AS RankOfMarks,
    FIND_IN_SET(Age,( SELECT GROUP_CONCAT( Age ORDER BY Age DESC ) FROM DemoTable634) ) AS RankOfAge
    FROM DemoTable634;

5. 実行結果

このクエリを実行すると、点数(Marks)と年齢(Age)それぞれに基づく順位が表示されます。

+-----------+-------+------+-------------+-----------+
| FirstName | Marks | Age  | RankOfMarks | RankOfAge |
+-----------+-------+------+-------------+-----------+
| John      |    60 |   23 |           3 |         2 |
| Chris     |    80 |   21 |           1 |         3 |
| Robert    |    70 |   24 |           2 |         1 |
+-----------+-------+------+-------------+-----------+
3 rows in set (0.01 sec)

仕組みの解説

このクエリのポイントは以下の2点です。

  • GROUP_CONCAT(カラム名 ORDER BY カラム名 DESC):指定カラムの全値を降順で連結した文字列(例:「80,70,60」)を生成します。
  • FIND_IN_SET(値, 文字列):カンマ区切りの文字列の中で、対象の値が何番目に現れるかを返します。降順で並べているため、そのまま順位として利用できます。

なお、同点の値が存在する場合は同じ順位が返される点に注意してください。より厳密なランキング処理が必要な場合は、MySQL 8.0以降で利用可能なウィンドウ関数「RANK()」や「DENSE_RANK()」の使用も検討するとよいでしょう。

  1. MySQLで1つのクエリを使って複数の列をまとめて並べ替える方法

    MySQLで複数の列の値を比較しながらレコードを並べ替えたい場合は、ORDER BY GREATEST()を使用します。GREATEST()は指定した複数の列の中から最も大きい値を返す関数であり、その値を基準にソートを行うことができます。それでは、実際にサンプルテーブルを作成して確認していきましょう。1. テーブルの作成まず、3つのint型カラムを持つテーブルを作成します。mysql> create table DemoTable1395    -> (    -> Value1 int,&nbs

  2. MySQLで空のカラムにカスタムテキストを表示する方法

    MySQLでは、IF()関数を使うことで、空(NULLや空文字列)のカラムに対して任意のカスタムテキストを表示できます。ここでは、実際の手順を例とともに解説します。1. テーブルを作成するまず、サンプル用のテーブルを作成します。mysql> create table DemoTable-> (-> FirstName varchar(20)-> );Query OK, 0 rows affected (0.77 sec)2. レコードを挿入する次に、INSERTコマンドを使ってテーブルにデータを追加します。このとき、意図的に空文字列のレコードも挿入しておきます。mysq