MySQLで複数の行・列を1行に連結する方法:GROUP_CONCATとCONCATの使い方
MySQLでは、GROUP_CONCAT()関数とCONCAT()関数を組み合わせることで、複数の行や列のデータを1つの行に連結できます。この記事では、実際のテーブル作成から連結クエリの実行まで、手順を追って解説します。
サンプルテーブルの作成
まず、デモ用のテーブルを作成します。顧客ID、氏名、年齢を持つシンプルなテーブルです。
mysql> create table DemoTable1463
-> (
-> ClientId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ClientName varchar(20),
-> ClientAge int
-> );
Query OK, 0 rows affected (1.37 sec)レコードの挿入
次に、INSERT文を使ってテーブルにデータを登録します。あえてNULL値を含むレコードも入れている点に注目してください。
mysql> insert into DemoTable1463(ClientName,ClientAge) values('Adam Smith',34);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1463(ClientName,ClientAge) values('John Doe',29);
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable1463(ClientName,ClientAge) values('David Miller',NULL);
Query OK, 1 row affected (0.28 sec)
mysql> insert into DemoTable1463(ClientName,ClientAge) values('John Smith',32);
Query OK, 1 row affected (0.14 sec)登録データの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select * from DemoTable1463;
実行結果は以下の通りです。
+----------+--------------+-----------+ | ClientId | ClientName | ClientAge | +----------+--------------+-----------+ | 1 | Adam Smith | 34 | | 2 | John Doe | 29 | | 3 | David Miller | NULL | | 4 | John Smith | 32 | +----------+--------------+-----------+ 4 rows in set (0.00 sec)
複数の行と列を1行に連結するクエリ
いよいよ本題です。GROUP_CONCAT()の中でCONCAT()を使うことで、各行の複数列を結合し、さらに全行をカンマ区切りの1つの文字列にまとめることができます。
mysql> select group_concat(concat(ClientId,':',ClientName,':',IFNULL(ClientAge,''))) from DemoTable1463;
実行結果は以下のようになります。
+------------------------------------------------------------------------+ | group_concat(concat(ClientId,':',ClientName,':',IFNULL(ClientAge,''))) | +------------------------------------------------------------------------+ | 1:Adam Smith:34,2:John Doe:29,3:David Miller:,4:John Smith:32 | +------------------------------------------------------------------------+ 1 row in set (0.04 sec)
ポイント解説
このクエリの重要なポイントはIFNULL()関数の使用です。ClientAge列にはNULL値が含まれていますが、CONCAT()は引数の1つでもNULLがあると結果全体がNULLになってしまいます。そこでIFNULL(ClientAge,'')とすることで、NULLの場合は空文字列に置き換え、「3:David Miller:」のように年齢なしでも正しく連結されます。
また、区切り文字を変更したい場合は、GROUP_CONCAT(... SEPARATOR ';')のようにSEPARATOR句を指定することも可能です。
-
MySQLで列の値と任意のテキストを連結して1つの列に表示する方法
MySQLで列の値とテキストを連結する方法MySQLでは、CONCAT()関数を使用することで、テーブルの列の値と任意のテキストを連結し、結果を1つの列として表示できます。本記事では、サンプルテーブルを作成し、実際に文字列を連結して表示するまでの手順を具体例とともに解説します。1. テーブルの作成まず、テーブルを作成しましょう。mysql> create table DemoTable -> ( -> Id int, -> Name varchar(20) -> );Query OK, 0 rows affected (0.93 sec)こ
-
MySQLで重複行を除外して1行だけ取得する方法(DISTINCTの使い方)
MySQLで重複行から1行のみを返すには?MySQLのテーブルに同じ値を持つ重複行が存在する場合、DISTINCTキーワードを使うことで、重複を排除した一意な行だけを取得できます。この記事では、実際にテーブルを作成し、データを挿入したうえで、DISTINCTによる重複除去の手順を解説します。1. テーブルを作成するまず、サンプル用のテーブルを作成します。mysql> create table DemoTable1998 ( Name varchar(20) ); Query OK, 0 rows affected (0.61 sec)2. レコードを挿入するINSERTコマンドを