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

MySQLで同じIDを持つレコードを特殊文字区切りで1行に連結するクエリ(CONCAT_WS+GROUP_CONCAT)

同じIDを持つ複数のレコードを、特殊文字で区切りながら1行にまとめて連結したい場合には、CONCAT_WS()GROUP_CONCAT()を組み合わせて使用するのが効果的です。この記事では、実際にテーブルを作成し、レコードを連結するまでの手順を順番に解説します。

サンプルテーブルの作成

まず、動作確認用のテーブルを作成しましょう。

mysql> create table DemoTable2016
    -> (
    -> UserId int,
    -> UserName varchar(20)
    -> );
Query OK, 0 rows affected (0.51 sec)

レコードの挿入

続いて、insertコマンドを使ってテーブルにいくつかのレコードを挿入します。

mysql> insert into DemoTable2016 values(1,'Chris');
Query OK, 1 row affected (0.17 sec)

mysql> insert into DemoTable2016 values(2,'Bob');
Query OK, 1 row affected (0.10 sec)

mysql> insert into DemoTable2016 values(1,'David');
Query OK, 1 row affected (0.14 sec)

mysql> insert into DemoTable2016 values(2,'Carol');
Query OK, 1 row affected (0.12 sec)

mysql> insert into DemoTable2016 values(1,'Sam');
Query OK, 1 row affected (0.14 sec)

登録データの確認

select文を実行して、テーブル内の全レコードを表示してみましょう。

mysql> select *from DemoTable2016;

実行すると、以下のような結果が得られます。

+--------+----------+
| UserId | UserName |
+--------+----------+
| 1      | Chris    |
| 2      | Bob      |
| 1      | David    |
| 2      | Carol    |
| 1      | Sam      |
+--------+----------+
5 rows in set (0.00 sec)

レコードを特殊文字で区切って連結するクエリ

ここからが本題です。UserIdごとにグループ化し、ユーザー名とIDをハイフン「-」で連結した上で、さらにカンマで区切って1行にまとめるには、以下のクエリを使用します。

mysql> select group_concat(concat_ws('-',UserName,UserId)) from DemoTable2016 group by UserId;

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

+----------------------------------------------+
| group_concat(concat_ws('-',UserName,UserId)) |
+----------------------------------------------+
| Chris-1,David-1,Sam-1                         |
| Bob-2,Carol-2                                  |
+----------------------------------------------+
2 rows in set (0.00 sec)

クエリのポイント

CONCAT_WS('-' , ...):第1引数に指定した区切り文字(ここではハイフン)を使って、複数の値を1つの文字列に連結します。
GROUP_CONCAT(...):グループごとに複数行の値を1つの文字列に集約します。デフォルトの区切り文字はカンマですが、SEPARATOR句で変更することも可能です。
GROUP BY UserId:同じUserIdを持つレコード同士をグループ化することで、IDごとに連結結果がまとめられます。

このように、CONCAT_WS()とGROUP_CONCAT()を組み合わせることで、IDごとの関連データを簡潔に1行へ整形できます。レポート出力やCSV形式へのエクスポートなど、さまざまな場面で活用できるテクニックなので、ぜひ覚えておきましょう。

  1. MySQLのUPDATE文で1つのクエリを使って複数のレコードを更新する方法

    MySQLでは、UPDATEステートメントを使うことで、1つのクエリで複数のカラムや複数のレコードの値をまとめて更新できます。この記事では、実際にサンプルテーブルを作成し、UPDATE文でデータを更新する具体的な手順を解説します。サンプルテーブルの作成まず、テーブルを作成しましょう。mysql> create table DemoTable     -> (     -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,    &

  2. MySQLのDELETE文とIN句を組み合わせて1つのクエリで複数レコードを削除する方法

    MySQLでは、IN()句を活用することで、複数の条件値に一致するレコードを1つのDELETEクエリでまとめて削除できます。個別に削除クエリを実行する必要がなく、効率的なデータ操作が可能になります。ここでは、サンプルテーブルを作成し、実際にIN()句を使ったレコード削除の手順を解説します。1. サンプルテーブルの作成まず、テーブルを作成しましょう。mysql> create table DemoTable1922 ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, StudentName varchar(20)