MySQLでフィールドの値を連結する方法!GROUP_CONCAT関数の使い方を解説
はじめに
MySQLで複数行のフィールド値を1つの文字列として連結したい場合、GROUP_CONCAT() 関数と GROUP BY 句を組み合わせて使用します。この記事では、実際のテーブル作成からデータ挿入、そしてGROUP_CONCAT()を使ったフィールド連結の手順を、具体例とともにわかりやすく解説します。
1. サンプルテーブルを作成する
まずはデモ用のテーブルを作成しましょう。ここでは学生ID・氏名・スコアを持つテーブルを定義します。
mysql> create table DemoTable
(
StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentName varchar(30),
StudentScore int
);
Query OK, 0 rows affected (0.51 sec)
2. テーブルにレコードを挿入する
次に、INSERT文を使ってサンプルデータを登録します。同じ学生名のレコードを複数件入れておくことで、連結結果が確認しやすくなります。
mysql> insert into DemoTable(StudentName, StudentScore) values('Bob',80);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable(StudentName, StudentScore) values('Bob',80);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(StudentName, StudentScore) values('Chris',90);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(StudentName, StudentScore) values('Chris',70);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(StudentName, StudentScore) values('Bob',50);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable(StudentName, StudentScore) values('David',60);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable(StudentName, StudentScore) values('Chris',99);
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable(StudentName, StudentScore) values('David',88);
Query OK, 1 row affected (0.18 sec)3. テーブルの中身を確認する
SELECT文ですべてのレコードを表示してみましょう。
mysql> select * from DemoTable;
実行すると以下のような結果が出力されます。
+-----------+-------------+--------------+
| StudentId | StudentName | StudentScore |
+-----------+-------------+--------------+
| 1 | Bob | 80 |
| 2 | Bob | 80 |
| 3 | Chris | 90 |
| 4 | Chris | 70 |
| 5 | Bob | 50 |
| 6 | David | 60 |
| 7 | Chris | 99 |
| 8 | David | 88 |
+-----------+-------------+--------------+
8 rows in set (0.00 sec)
4. GROUP_CONCAT()でフィールドを連結する
いよいよ本題です。以下のクエリを実行すると、学生ごと(StudentNameごと)にスコアをカンマ区切りで連結した結果を取得できます。
mysql> select
StudentName, group_concat(StudentScore separator ',') as Score
from DemoTable
group by StudentName;
実行結果は次のとおりです。
+-------------+----------+
| StudentName | Score |
+-------------+----------+
| Bob | 80,80,50 |
| Chris | 90,70,99 |
| David | 60,88 |
+-------------+----------+
3 rows in set (0.24 sec)
GROUP_CONCAT()のポイントまとめ
- separator句:区切り文字は
SEPARATOR句で自由に指定できます。指定しない場合はデフォルトでカンマ(,)が使用されます。 - DISTINCTとの併用:
GROUP_CONCAT(DISTINCT StudentScore)のように書けば、重複した値を除外して連結できます。 - ORDER BYとの併用:グループ内の値をソートしてから連結することも可能です(例:
GROUP_CONCAT(StudentScore ORDER BY StudentScore))。 - 文字数制限に注意:連結結果の最大長はシステム変数
group_concat_max_len(デフォルト1024バイト)で決まります。大量データを扱う場合は設定変更が必要です。
まとめ
MySQLでフィールドの値を連結するには、GROUP_CONCAT()関数をGROUP BY句と一緒に使うのが基本です。今回のように学生ごとにスコアを一覧化するケース以外にも、タグの一覧表示やログの集約など、さまざまな場面で活用できます。ぜひ実際のプロジェクトでも試してみてください。
-
MySQLのORDER BY CASEとIN()を使ってグループ化したフィールドを並べ替える方法
MySQLでグループ化したフィールドを並べ替えるには?グループ化されたフィールドに対して並べ替えを行いたい場合は、ORDER BY CASEとIN()を組み合わせて使用します。CASE式は複数の条件を評価して優先順位を決め、ORDER BYはその結果をもとに値を昇順または降順にソートします。また、MySQLのIN()は指定した複数の値の中から一致するものを検索するために使われます。この仕組みにより、「特定の値をまとめて先頭に表示したい」「カスタム順序でソートしたい」といった柔軟な並べ替えが可能になります。1. テーブルを作成するまず、サンプル用のテーブルを作成しましょう。mysql> c
-
MySQLでデータフィールドをマスクする方法:CONCAT()とREPEAT()を活用した実装手順
MySQLでパスワードなどの機密性の高いデータフィールドをマスクするには、CONCAT()関数とREPEAT()関数を組み合わせるのが効果的です。この記事では、文字列の先頭5文字を残し、それ以外を「#」で置き換えるマスキング処理を、実際のコード例とともに段階的に解説します。 1. サンプルテーブルの作成 まず、マスク対象となるテーブルを作成します。 mysql> create table DemoTable1410 -> ( -> Password varchar(80) -> ); Query OK, 0 rows affected (0.5