MySQLで複数レコードの同一カラム値を確認し、区切り文字で1行にまとめる方法(GROUP_CONCAT+DISTINCT)
MySQLで複数レコードの値を1行にまとめるには
複数のレコードにまたがって同じカラム値が存在するかを確認し、それらの値を区切り文字(特殊文字)で連結して1行にまとめたいケースはよくあります。このような場合には、GROUP_CONCAT()関数にDISTINCTを組み合わせるのが効果的です。
テーブルの作成
まず、サンプル用のテーブルを作成しましょう。
mysql> create table DemoTable
(
Id int,
Subject varchar(40)
);
Query OK, 0 rows affected (0.56 sec)
レコードの挿入
INSERTコマンドを使用して、いくつかのレコードを追加します。
mysql> insert into DemoTable values(100,'MySQL');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values(100,'MongoDB');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable values(100,'Java');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(100,'MongoDB');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values(101,'MySQL');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values(101,'MySQL');
Query OK, 1 row affected (0.10 sec)
テーブルの中身を確認する
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
実行結果は以下のとおりです。
+------+---------+
| Id | Subject |
+------+---------+
| 100 | MySQL |
| 100 | MongoDB |
| 100 | Java |
| 100 | MongoDB |
| 101 | MySQL |
| 101 | MySQL |
+------+---------+
6 rows in set (0.00 sec)
Id=100には「MySQL」「MongoDB」「Java」が登録され、「MongoDB」は重複しています。また、Id=101にも「MySQL」が2件重複していることがわかります。
GROUP_CONCAT()とDISTINCTで重複を除いて1行にまとめる
以下のクエリは、複数レコード間のカラム値を確認しながら、重複を排除したうえで特殊文字(ここではハイフン「-」)をセパレータとして1行にまとめて取得する例です。
mysql> select Id,group_concat(distinct Subject separator '-') as Subject
from DemoTable
group by Id;
実行結果は以下のとおりです。
+------+--------------------+
| Id | Subject |
+------+--------------------+
| 100 | Java-MongoDB-MySQL |
| 101 | MySQL |
+------+--------------------+
2 rows in set (0.04 sec)
クエリのポイント解説
- GROUP BY Id:Idごとにレコードをグループ化し、各Idにつき1行の結果を生成します。
- DISTINCT:グループ内で重複するSubjectの値を除外します。「MongoDB」や「MySQL」がそれぞれ1回だけ表示されるのはこの効果です。
- separator '-':連結時の区切り文字を指定します。デフォルトはカンマ「,」ですが、separator句を使えばハイフンなど任意の特殊文字に変更できます。
このようにGROUP_CONCAT()を活用すれば、複数レコードに散らばる値を簡単に集約し、見やすい形式で1行にまとめることができます。区切り文字を変えれば、CSV形式やパイプ区切りなど、用途に応じた出力も柔軟に対応可能です。
-
MySQLですべての行の値をカンマ区切りの単一の行として表示する方法
GROUP_CONCAT()とCONCAT()を使って複数行の値を1行にまとめる方法MySQLでテーブル内の複数の行に格納された値を、カンマ(コンマ)で区切られた単一の行として取得したい場合には、GROUP_CONCAT()関数とCONCAT()関数を組み合わせて使用します。GROUP_CONCAT()はグループ内の複数の値を連結して文字列として返し、CONCAT()を使うことで各値の前後に任意の文字を追加できます。以下では、実際の手順をサンプルコードとともに順番に解説していきます。1. サンプルテーブルを作成するまず、テスト用のテーブルを作成します。ここではint型の「Id」カラムを持つシン
-
MySQLで同じIDを持つレコードを特殊文字区切りで1行に連結するクエリ(CONCAT_WS+GROUP_CONCAT)
同じIDを持つ複数のレコードを、特殊文字で区切りながら1行にまとめて連結したい場合には、CONCAT_WS()とGROUP_CONCAT()を組み合わせて使用するのが効果的です。この記事では、実際にテーブルを作成し、レコードを連結するまでの手順を順番に解説します。サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable2016 -> ( -> UserId int,