リモートで働くプログラマーの検索結果

リモ太がググったことの覚書

PostgreSQLで1対NのテーブルでNの項目を結合してセレクトする

STRING_AGG を使ってNとなるテーブルの値を結合してセレクトする

f:id:remoter:20200123170315p:plain

上のようなデータ構造で自分がユーザー一覧に所属するチームの名前をあわせてセレクトしたい場合

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