PostgreSQLで1対NのテーブルでNの項目を結合してセレクトする
STRING_AGG
を使ってNとなるテーブルの値を結合してセレクトする
上のようなデータ構造で自分がユーザー一覧に所属するチームの名前をあわせてセレクトしたい場合
SELECT users.id, users.name, join_groups.names as group_names FROM users LEFT OUTER JOIN ( SELECT memberships.user_id, STRING_AGG(groups.name, ',' order by memberships.group_id) as names FROM memberships JOIN groups ON groups.id = memberships.group_id GROUP BY memberships.user_id ) join_groups ON join_groups.user_id = users.id
上のようなSQLを実行すると以下のような結果が得られる
id | name | group_names |
---|---|---|
1 | 田中 | グループ1,グループ2 |
2 | 佐藤 | グループ2,グループ3,グループ4 |
3 | 山田 | グループ1 |