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

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行に集約できます。

  1. MySQLのINSERT INTO SELECT文で静的な値を追加する方法【実例つき】

    MySQLでは、INSERT INTO ... SELECTクエリを使って別テーブルからデータをコピーする際に、同時に静的な値(固定値)を追加できます。追加方法は主に2つあります。SELECT文に値を直接記述する方法と、事前に初期化した変数を使う方法です。 ケース1: SELECT文に静的な値を直接記述する 最もシンプルなのは、INSERT INTO SELECT文の中に固定値をそのまま書き込む方法です。構文は以下の通りです。 INSERT INTO yourSecondTableName(yourColumnName1,yourColumnName2,....N) SELECT y

  2. 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)のいずれかを使用