🏘️

【備忘録】group concatメソッド

2024/05/14に公開

仕事でBIツール MetaBaseを使用し、
非エンジニア向けにダッシュボードやエクセルのエクスポート機能を提供しています。

情報に紐づくタグを1行で表示してほしいという要望があり、
group_concatメソッドを使用したので使い方をまとめました。

group_concatメソッドとは

mysqlの公式ドキュメントには次のように記載されています。

この関数は、グループから連結された非 NULL 値を含む文字列の結果を返します。 非 NULL 値がない場合は、NULL を返します。

https://dev.mysql.com/doc/refman/8.0/ja/aggregate-functions.html#function_group-concat


GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

複数行のデータを1行で表したい場合に使用します。
対象のデータに対してdistinctを指定することで重複を除外したり、
order byで並び替えを行うことができます。

SELECT student_name,
  GROUP_CONCAT(test_score)
FROM student
GROUP BY student_name;

ChatGPTに生成してもらった次のデータで動作を試します。


CREATE TABLE blog_posts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    content TEXT NOT NULL,
    post_date DATE NOT NULL,
    author VARCHAR(100)
);

CREATE TABLE blog_post_tags (
    id INT AUTO_INCREMENT PRIMARY KEY,
    post_id INT,
    tag_name VARCHAR(100),
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (post_id) REFERENCES blog_posts(id)
);

blog
tag

ブログ記事のテーブルのIDでグループ化して、
タグをカンマ区切りで表示する例が次のクエリです。


SELECT 
    bp.title as タイトル,
    bp.content as 本文,
    GROUP_CONCAT(bpt.tag_name SEPARATOR ', ') AS タグ
FROM 
    blog_posts bp
INNER JOIN 
    blog_post_tags bpt ON bp.id = bpt.post_id
GROUP BY 
    bp.id

group_concat

記事に紐づくタグがタグカラムにカンマ区切りで表示されています。
NULLは表示されていません。
重複しているカラムがある場合はdistinctを指定することで重複を除外できます。

GROUP_CONCAT(DISTINCT bpt.tag_name SEPARATOR ', ') 

また、タグを最新順に並べたい場合はorder byを指定します。

GROUP_CONCAT(bpt.tag ORDER BY bpt.created_at SEPARATOR ', ') 

余談

ChatGPTに設定を記憶させる「Memory」機能が
4月末にPlusプランの正式機能としてリリースされました。

https://www.itmedia.co.jp/news/articles/2404/30/news080.html

記憶させると具体例を作成させる際に趣味嗜好を反映してくれるので、
少し楽しいです。
(もっと革新的な使い方が間違いなくあると思いますが...😅)

GitHubで編集を提案

Discussion