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形式へのエクスポートなど、さまざまな場面で活用できるテクニックなので、ぜひ覚えておきましょう。
-
MySQLのUPDATE文で1つのクエリを使って複数のレコードを更新する方法
MySQLでは、UPDATEステートメントを使うことで、1つのクエリで複数のカラムや複数のレコードの値をまとめて更新できます。この記事では、実際にサンプルテーブルを作成し、UPDATE文でデータを更新する具体的な手順を解説します。サンプルテーブルの作成まず、テーブルを作成しましょう。mysql> create table DemoTable -> ( -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, &
-
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)