MySQLでGROUP_CONCATの書き方

MySQLでGROUP_CONCATの書き方

MySQLのGROUP_CONCAT関数は、複数の行から結果を1つの文字列として連結して返すのに役立つ集約関数です。
通常、GROUP BY句と一緒に使用され、特定のグループに属するデータを1行にまとめて表示する際に便利です。
これにより、結果セットをより簡潔にし、必要に応じてカスタマイズすることができます。

基本的な構文は以下の通りです。

SELECT GROUP_CONCAT(列名)
FROM テーブル名
GROUP BY 列名;

例として、あるテーブルemployeesが以下のようなデータを持っているとします。

id department employee_name
----- ------------ ---------------
1 HR Alice
2 HR Bob
3 IT Carol
4 IT Dave
5 IT Eve

HR部門に所属する全ての従業員の名前を連結し、1行にまとめて表示したい場合、次のようにGROUP_CONCATを使用します。

SELECT department, GROUP_CONCAT(employee_name) AS employees
FROM employees
GROUP BY department;

このクエリの結果は次のようになります。

department employees
------------ ------------------
HR Alice,Bob
IT Carol,Dave,Eve

GROUP_CONCAT関数により、各部門ごとの従業員名が1つの文字列として結合されて返されます。

区切り文字のカスタマイズ

GROUP_CONCATはデフォルトでカンマ(,)を区切り文字として使用しますが、SEPARATORオプションを使うことで、この区切り文字を変更することが可能です。
例えば、従業員名をセミコロンで区切りたい場合は次のように書きます。

SELECT department, GROUP_CONCAT(employee_name SEPARATOR '; ') AS employees
FROM employees
GROUP BY department;

このクエリの結果は次のようになります。

department employees
------------ --------------------
HR Alice; Bob
IT Carol; Dave; Eve

重複の排除

GROUP_CONCATはデフォルトで重複する値もすべて結合しますが、重複を取り除くにはDISTINCTキーワードを使用します。
以下の例では、重複する従業員名を削除して結果を取得します。

SELECT department, GROUP_CONCAT(DISTINCT employee_name) AS employees
FROM employees
GROUP BY department;

これにより、同じ名前の従業員が複数いる場合でも、一度しか表示されません。

結果のソート

GROUP_CONCATでは、結合される要素を指定の順序で並べることも可能です。
ORDER BYを使用して、結果のソート順をカスタマイズできます。
例えば、従業員名をアルファベット順に並べるには以下のように記述します。

SELECT department, GROUP_CONCAT(employee_name ORDER BY employee_name ASC) AS employees
FROM employees
GROUP BY department;

このクエリの結果は次の通りです。

department employees
------------ ------------------
HR Alice,Bob
IT Carol,Dave,Eve

ORDER BY句にDESC(降順)を指定することで、逆順に並べることも可能です。

GROUP_CONCATの最大長

GROUP_CONCATで生成される文字列の長さには制限があります。
MySQLのデフォルト設定では、GROUP_CONCATが返す文字列の最大長は1024文字に制限されています。
もし、1024文字を超える結果を取得したい場合は、次のように設定を変更する必要があります。

SET SESSION group_concat_max_len = 10000;

このクエリにより、セッションのGROUP_CONCATの最大長を10000バイトに変更できます。
より大きな結果を取得する場合は、適切な値に変更してください。

実用例

例えば、商品データを扱うテーブルがあり、各カテゴリーに属する商品のリストを生成するケースを考えます。
以下のようなproductsテーブルがあるとします。

product_id category product_name
------------ ------------- --------------
1 Electronics TV
2 Electronics Laptop
3 Furniture Sofa
4 Furniture Table
5 Electronics Phone

このテーブルを使って、各カテゴリーごとの商品リストを連結して取得する場合、以下のクエリを使用します。

SELECT category, GROUP_CONCAT(product_name ORDER BY product_name ASC) AS product_list
FROM products
GROUP BY category;

このクエリは、カテゴリーごとの商品名をアルファベット順に並べて結合した結果を返します。

category product_list
------------- -----------------------
Electronics Laptop,Phone,TV
Furniture Sofa,Table

まとめ

MySQLのGROUP_CONCATは、データを集約して1つの文字列に連結するための強力なツールです。
区切り文字の変更、重複の排除、ソートのカスタマイズなど、柔軟に使用できるため、さまざまな集約ニーズに対応します。
ただし、最大文字列長に注意し、必要に応じて設定を調整することが重要です。