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

MySQLのGROUP_CONCAT()を使って複数行のデータを連結する方法

MySQLでは、GROUP_CONCAT()関数を使用することで、複数行に分かれているデータを1つの文字列に連結できます。カンマ区切りで値をまとめたい場合や、検索結果を見やすく整形したい場合に非常に便利な関数です。

この記事では、実際にテーブルを作成し、ストアドプロシージャと組み合わせてGROUP_CONCAT()を使う手順を解説します。

1. テーブルの作成

まず、サンプル用のテーブルを作成します。

mysql> create table DemoTable (CountryName varchar(100));
Query OK, 0 rows affected (1.01 sec)

次に、INSERT文でレコードを挿入します。

2. レコードの挿入

mysql> insert into DemoTable values('US');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('AUS');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('UK');
Query OK, 1 row affected (0.19 sec)

3. 登録データの確認

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

mysql> select *from DemoTable;

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

+-------------+
| CountryName |
+-------------+
| US          |
| AUS         |
| UK          |
+-------------+
3 rows in set (0.00 sec)

4. ストアドプロシージャの作成

ここからが本題です。複数行のデータを連結するために、GROUP_CONCAT()を使ったストアドプロシージャを作成します。DISTINCT句で重複を除外し、ORDER BY句でソートした上で連結している点がポイントです。

mysql> DELIMITER //
mysql> CREATE PROCEDURE searchDemo(in stringValue varchar(255), out output text)
    BEGIN
      select group_concat(distinct CountryName order by CountryName) into output from DemoTable where
      CountryName like stringValue;
    END
    //
Query OK, 0 rows affected (0.18 sec)
mysql> DELIMITER ;

このプロシージャは、引数として渡されたパターン(stringValue)に一致する国名を抽出し、GROUP_CONCAT()で連結した結果を出力パラメータ(output)に格納します。

5. ストアドプロシージャの呼び出し

CALLコマンドを使ってストアドプロシージャを実行します。ここでは「U」で始まる国名を検索しています。

mysql> call searchDemo('U%',@output);
Query OK, 1 row affected, 2 warnings (0.04 sec)

6. 結果の確認

変数@outputの値を確認しましょう。

mysql> select @output;

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

+---------+
| @output |
+---------+
| UK,US   |
+---------+
1 row in set (0.00 sec)

「U%」に一致する「UK」と「US」が、アルファベット順にソートされてカンマ区切りの1つの文字列(UK,US)として出力されました。

まとめ

GROUP_CONCAT()を使えば、複数行に分かれたデータを簡単に1つの文字列へ連結できます。DISTINCTによる重複排除やORDER BYによる並び替えも同時に行えるため、集計結果の表示やCSV形式でのデータ出力など、さまざまな場面で活用できる便利な関数です。ストアドプロシージャと組み合わせれば、再利用性の高い処理も実現できます。

  1. 複数テーブルのデータを組み合わせてMySQLビューを作成する方法(UNION演算子の活用)

    MySQLでは、UNION演算子を使うことで、2つ以上のSELECT文の結果セットを1つに結合できます。この特性を利用すれば、複数のテーブルから取得したデータをまとめたビュー(VIEW)を簡単に作成できます。ここでは、以下のような2つの基本テーブル「Student_info」と「Student_detail」を例に説明します。サンプルテーブル:Student_infomysql> Select * from Student_info; +------+---------+------------+------------+ | id | Name | Address |

  2. MySQLでテーブルの最後の10件のレコードを取得する方法

    MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected