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

MySQLのGROUP_CONCATで連番を実装する方法

MySQLでは、GROUP_CONCAT()とユーザー定義変数を組み合わせることで、グループごとに連番を付けた文字列を生成できます。この記事では、姓(LastName)ごとに名前(FirstName)へ連番を付けて結合する方法を、具体的な手順とともに解説します。

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

まず、以下のコマンドでテーブルを作成します。

mysql> create table DemoTable1627
    -> (
    -> FirstName varchar(20),
    -> LastName varchar(20)
    -> );
Query OK, 0 rows affected (0.59 sec)

2. レコードの挿入

次に、INSERTコマンドを使ってテーブルにレコードを挿入します。

mysql> insert into DemoTable1627 values('John','Smith');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1627 values('John','Doe');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1627 values('Adam','Smith');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable1627 values('Carol','Taylor');
Query OK, 1 row affected (0.08 sec)

3. テーブルの内容を確認

SELECT文でテーブル内のすべてのレコードを表示してみましょう。

mysql> select * from DemoTable1627;

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

+-----------+----------+
| FirstName | LastName |
+-----------+----------+
| John      | Smith    |
| John      | Doe      |
| Adam      | Smith    |
| Carol     | Taylor   |
+-----------+----------+
4 rows in set (0.00 sec)

4. GROUP_CONCATで連番を付けるクエリ

ここが本題です。ユーザー定義変数@p@jを使い、同じ姓が続く限りカウンターを増やし、姓が変わった時点で1にリセットすることで、グループ内の連番を実現しています。

mysql> select  LastName,
    -> group_concat(
    -> concat(@j := if (@p = LastName, @j + 1, if(@p := LastName,1,1)), '.', FirstName)
    -> separator ', ') FirstName
    -> from   DemoTable1627
    -> group by LastName;

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

+----------+----------------+
| LastName | FirstName      |
+----------+----------------+
| Doe      | 1.John         |
| Smith    | 1.John, 2.Adam |
| Taylor   | 1.Carol        |
+----------+----------------+
3 rows in set (0.09 sec)

クエリの仕組みのポイント

  • @p(前回の姓を保持する変数):現在の行の姓と比較するために使われます。
  • @j(連番カウンター):姓が同じであれば@j + 1でインクリメントし、異なる場合は1にリセットされます。
  • GROUP_CONCAT:連番と名前を.で連結した文字列を、, 区切りで1つの文字列にまとめます。

このように、ユーザー定義変数とGROUP_CONCATを組み合わせれば、GROUP BYでグループ化した各グループ内に連番を振った集約結果を簡単に作成できます。なお、MySQL 8.0以降ではROW_NUMBER()などのウィンドウ関数も利用できるため、より読みやすいクエリで同様の結果を得ることも可能です。

  1. MySQLで調和平均と二乗平均(Quadratic Mean)を計算する方法

    MySQLには調和平均(Harmonic Mean)や二乗平均(Quadratic Mean)を直接求める組み込み関数は用意されていませんが、COUNT()、SUM()、SQRT()といった基本的な集計関数・数学関数を組み合わせることで、簡単に実装できます。サンプルテーブルの作成まず、以下のようにテーブルを作成します。mysql> create table DemoTable1606 -> ( -> Value int -> );Query OK, 0 rows affected (0.55 sec)レコードの挿入INSERTコマンドを使って、テーブル

  2. MySQLでDOUBLE型の桁数(長さ)を実装・設定する方法

    MySQLでDOUBLE型のカラムを作成する場合、以下のような構文を使用します。create table yourTableName ( yourColumnName double(5,2) unsigned );DOUBLE型の構文についてdouble(5,2) の「5」は整数部と小数部を合わせた全体の桁数、「2」は小数点以下の桁数を表します。つまり、この設定では最大で 999.99 までの値を格納できます。さらに、unsigned を指定すると負の値が除外され、正の数値のみを扱うカラムになります。テーブルの作成まず、実際にテーブルを作成してみましょう。mysql> create ta