MySQLで重複する値をまとめて整形しながらデータを取得する最も効率的な方法
MySQLでは、GROUP_CONCAT() 関数を使うことで、同じ値(重複する値)を持つ複数のレコードを1行にまとめ、カンマ区切りなどの読みやすい形式に整形して取得できます。ここでは、実際のサンプルを使って手順を順番に解説します。
1. サンプルテーブルを作成する
まず、学生名と学習タイトルを格納するテーブルを作成します。
mysql> create table DemoTable1561 -> ( -> StudentName varchar(20), -> Title text -> ); Query OK, 0 rows affected (0.60 sec)
2. レコードを挿入する
INSERT文を使って、いくつかのレコードを登録します。ここでは「Adam」が2件存在する点に注目してください。
mysql> insert into DemoTable1561 values('Adam','Learning Java');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable1561 values('Bob','Learning C');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1561 values('Adam','Learning Spring and Hibernate Framework');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable1561 values('Carol','Learning MySQL from basic');
Query OK, 1 row affected (0.30 sec)
3. 登録したデータを確認する
SELECT文ですべてのレコードを表示してみましょう。
mysql> select * from DemoTable1561;
実行すると、次のような出力が得られます。
+-------------+-----------------------------------------+ | StudentName | Title | +-------------+-----------------------------------------+ | Adam | Learning Java | | Bob | Learning C | | Adam | Learning Spring and Hibernate Framework | | Carol | Learning MySQL from basic | +-------------+-----------------------------------------+ 4 rows in set (0.00 sec)
4. GROUP_CONCAT()でデータを整形して取得する
次のクエリを実行すると、StudentNameごとにTitleをカンマ区切りで連結した形でデータを取得できます。
mysql> select StudentName,group_concat(Title separator ',') as FormattedOutput from DemoTable1561 -> group by StudentName;
実行結果は以下のとおりです。「Adam」の2件のレコードが1行にまとまっていることがわかります。
+-------------+-------------------------------------------------------+ | StudentName | FormattedOutput | +-------------+-------------------------------------------------------+ | Adam | Learning Java,Learning Spring and Hibernate Framework | | Bob | Learning C | | Carol | Learning MySQL from basic | +-------------+-------------------------------------------------------+ 3 rows in set (0.00 sec)
ポイントのまとめ
- GROUP_CONCAT():グループ内の複数の値を1つの文字列に連結できる集計関数です。
- separator:区切り文字を指定できます。デフォルトはカンマ「,」ですが、「separator ' / '」のように任意の区切り文字へ変更可能です。
- GROUP BY:StudentNameでグループ化することで、同名の学生の学習タイトルが1行に集約されます。
- 大量データを扱う場合は、システム変数 group_concat_max_len(デフォルトは1024バイト)の上限に注意が必要です。必要に応じて値を引き上げてください。
-
MySQLで重複する値ごとのレコードを別の列に合計して表示する方法
MySQLでは、重複している値(同じ名前など)を持つ複数のレコードの数値を、名前ごとにまとめて合計したいケースがあります。このような場合には、集計関数SUM()とGROUP BY句を組み合わせることで簡単に実現できます。本記事では、実際にサンプルテーブルを作成し、重複する値を持つレコードを別の列(合計列)として集計・表示する手順を解説します。1. サンプルテーブルを作成するまず、CREATE TABLE文を使ってテーブルを作成します。mysql> create table DemoTable -> ( -> Name varchar(20), -> V
-
MySQLで条件に応じて同じ列の2つの値を連結する方法
MySQLで条件に応じて同じ列の2つの値を連結する方法 MySQLでは、max() などの集計関数と CASE 式を組み合わせることで、条件の異なる同じ列の値を1つの文字列として連結できます。この記事では、サンプルテーブルを作成しながら、具体的な手順をわかりやすく解説します。 1. サンプルテーブルの作成 まず、create table コマンドでテーブルを作成しましょう。 mysql> create table DemoTable1869 ( Id int, &nb