MySQLで重複する値ごとに対応する値をハイフン区切りで結合する方法
MySQLで重複データをハイフン区切りで1行にまとめるには
テーブル内に同じ値を持つ行が複数存在する場合、それらに対応する別のカラムの値を1つの文字列にまとめて表示したいことがあります。このようなときに活躍するのが、GROUP_CONCAT()関数です。GROUP_CONCAT()を使えば、GROUP BYでグループ化した各グループの値を連結でき、SEPARATOR句で区切り文字(ここではハイフン)を自由に指定できます。
それでは、実際の手順を見ていきましょう。
1. サンプルテーブルを作成する
まず、テーブルを作成します。
mysql> create table DemoTable1386
-> (
-> Title varchar(255),
-> Name varchar(60)
-> );
Query OK, 0 rows affected (0.67 sec)
2. テストデータを挿入する
INSERT文を使って、いくつかのレコードを挿入します。
mysql> insert into DemoTable1386 values('Introduction to MySQL','Paul DuBois');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1386 values('Java in Depth','Khalid Mughal');
Query OK, 1 row affected (0.48 sec)
mysql> insert into DemoTable1386 values('Introduction to MySQL','Russell Dyer');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable1386 values('Java in Depth','Joshua Bloch');
Query OK, 1 row affected (0.17 sec)3. すべてのレコードを確認する
SELECT文で全レコードを表示してみましょう。
mysql> select * from DemoTable1386;
以下のような結果が得られます。
+-----------------------+---------------+
| Title | Name |
+-----------------------+---------------+
| Introduction to MySQL | Paul DuBois |
| Java in Depth | Khalid Mughal |
| Introduction to MySQL | Russell Dyer |
| Java in Depth | Joshua Bloch |
+-----------------------+---------------+
4 rows in set (0.00 sec)
「Introduction to MySQL」と「Java in Depth」がそれぞれ2件ずつ重複していることがわかります。
4. 重複する値をハイフン区切りで結合する
次のクエリを実行すると、重複するTitleごとにNameをハイフンで連結して取得できます。
mysql> select Title,group_concat(Name separator '----') from DemoTable1386
-> group by Title;
実行結果は以下の通りです。
+-----------------------+-------------------------------------+
| Title | group_concat(Name separator '----') |
+-----------------------+-------------------------------------+
| Introduction to MySQL | Paul DuBois----Russell Dyer |
| Java in Depth | Khalid Mughal----Joshua Bloch |
+-----------------------+-------------------------------------+
2 rows in set (0.00 sec)
補足ポイント
separator '----'の部分をseparator '-'やseparator ', 'などに変更すれば、任意の区切り文字を使用できます。- 区切り文字を指定しない場合、デフォルトではカンマ(,)で連結されます。
ORDER BYをGROUP_CONCAT内に追加すると、連結される値の並び順を制御することも可能です。
このように、GROUP_CONCAT()関数とSEPARATOR句を組み合わせることで、重複する値に紐づく複数のレコードを、読みやすい形式で1行に集約できます。
-
MySQLのINSERT INTO SELECT文で静的な値を追加する方法【実例つき】
MySQLでは、INSERT INTO ... SELECTクエリを使って別テーブルからデータをコピーする際に、同時に静的な値(固定値)を追加できます。追加方法は主に2つあります。SELECT文に値を直接記述する方法と、事前に初期化した変数を使う方法です。 ケース1: SELECT文に静的な値を直接記述する 最もシンプルなのは、INSERT INTO SELECT文の中に固定値をそのまま書き込む方法です。構文は以下の通りです。 INSERT INTO yourSecondTableName(yourColumnName1,yourColumnName2,....N) SELECT y
-
PHPとMySQLでブール値を扱うには?BOOL・BOOLEAN・TINYINT(1)の違いと使い方
本記事では、MySQL 8.0.12を使用して、ブール(Boolean)値の正しい取り扱い方を解説します。まず、使用しているMySQLのバージョンを確認しておきましょう。 mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.12 | +-----------+ 1 row in set (0.00 sec) MySQLにおけるブール値の基本:BOOL・BOOLEAN・TINYINT(1) MySQLでブール値を扱うには、BOOL、BOOLEAN、またはTINYINT(1)のいずれかを使用