MySQLのGROUP_CONCAT関数を使ってグループ内のすべての値を1行にまとめて表示する方法
MySQLでは、GROUP_CONCAT() 関数を使用することで、グループ内の複数の値を1つのレコードにカンマ区切りでまとめて表示できます。この記事では、実際にテーブルを作成し、データを登録して、GROUP_CONCAT() の使い方を具体的な例とともに解説します。
1. サンプルテーブルの作成
まず、以下のようにテーブルを作成します。
mysql> create table DemoTable
(
ProductId int,
ProductName varchar(40),
ProductCategory varchar(40)
);
Query OK, 0 rows affected (0.67 sec)
2. テストデータの登録
次に、INSERT文を使ってサンプルデータを挿入します。同じ ProductId(100)に対して、異なるカテゴリが2件登録されている点に注目してください。
mysql> insert into DemoTable values(100,'Product-1','1Product'); Query OK, 1 row affected (0.11 sec) mysql> insert into DemoTable values(101,'Product-2','2Product'); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable values(100,'Product-1','3Product'); Query OK, 1 row affected (0.14 sec)
3. 登録したデータの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
実行結果は以下の通りです。
+-----------+-------------+-----------------+ | ProductId | ProductName | ProductCategory | +-----------+-------------+-----------------+ | 100 | Product-1 | 1Product | | 101 | Product-2 | 2Product | | 100 | Product-1 | 3Product | +-----------+-------------+-----------------+ 3 rows in set (0.00 sec)
4. GROUP_CONCAT() でグループごとに値をまとめる
ここからが本題です。GROUP_CONCAT() 関数を使うことで、ProductId ごとの ProductCategory を1つの文字列に連結して取得できます。
mysql> select ProductId,group_concat(ProductCategory) AS `GROUP` FROM DemoTable group by ProductId;
実行結果は以下の通りです。
+-----------+-------------------+ | ProductId | GROUP | +-----------+-------------------+ | 100 | 1Product,3Product | | 101 | 2Product | +-----------+-------------------+ 2 rows in set (0.00 sec)
5. 補足:GROUP_CONCAT() の便利なオプション
GROUP_CONCAT() には、より柔軟に出力を整形できるオプションがあります。
- DISTINCT: 重複する値を除外したい場合は
GROUP_CONCAT(DISTINCT ProductCategory)のように指定します。 - ORDER BY:
GROUP_CONCAT(ProductCategory ORDER BY ProductCategory ASC)と書くことで、連結される順序を制御できます。 - SEPARATOR: 区切り文字はデフォルトでカンマですが、
SEPARATOR ' / 'のように任意の文字列に変更できます。 - group_concat_max_len: 結果の最大長はデフォルトで1024バイトに制限されているため、大量データを扱う場合はシステム変数
group_concat_max_lenの値を引き上げておくとよいでしょう。
このように、GROUP_CONCAT() 関数と GROUP BY 句を組み合わせることで、「1対多」の関係にあるデータを簡単に1行に集約して表示することができます。レポート作成やCSV形式でのエクスポートなど、さまざまな場面で活用できる便利な関数なので、ぜひ覚えておきましょう。
-
MySQLですべてのレコードを1行にまとめて取得する方法(GROUP_CONCAT活用)
GROUP_CONCAT()を使って複数行のデータを1行に連結するテーブル内の複数レコードを、区切り文字でつなげて1つの文字列として取得したい場合は、MySQLのGROUP_CONCAT()関数を使用します。この関数を使うことで、パスのような形式の文字列も簡単に生成できます。ここでは、「E:/AllPrograms/ChatApplicationInJava/MainFolder」のようにフォルダ階層を表す文字列を作成する例を見ていきましょう。1. サンプルテーブルの作成まず、Locationカラムを持つテーブルを作成します。mysql> create table DemoTable13
-
MySQLデータベース内のすべてのテーブルを一覧表示する方法
```html ここでは、MySQLデータベース内のすべてのテーブルを一覧表示する方法について解説します。 データベースの選択 データベースを作成した後、そのデータベースにアクセスして使用するには、以下のクエリを実行します。 mysql> USE databaseName Database changed USEステートメントの特徴 USEステートメントはセミコロンを必要としません。これはQUITステートメントと同様の仕様です。ただし、セミコロンを付けても問題はありません。 自分専用のデータベースを作成して使用することも可能ですが、その前にMySQL管理者の権限付与が必要になります。