如何进行查询以获取用户的所有组,显示每个组拥有的用户(postgresql)

How to make a query to get all groups of a user, showing the users that each group has (postgresql)

这个问题我一开始觉得很简单,但是一直没能解决。

我得到了一个 table users(id, username, email) 和另一个 table groups(id, name)。我得到了第三个 table,它存储了另外两个 groups_users(groupId, userId).

之间的多对多关系

我想进行查询以获取某个用户所属的组。我还希望那些查询组包含各自用户的嵌套数据。 翻译成 JSON,它会是这样的:

[
  {
    id: 1,
    name: 'foo group',
    users: [
      {
        id: 1,
        name: 'bar',
        email: 'bar@foo.com'
      }
   ]
]

我应该对 Postgres 进行原始查询以实现此目的有什么想法吗?我知道我必须使用 Postgres 的功能,这也是问题的一部分。提前致谢。

找出用户属于哪些组 (g)。然后将其与 groups_users 结合以获得那些 user_ids 并将其与用户结合到 user_info.

select *
from (
  groups_users natural join 
  (select groupId from groups_users where userId = ?) g
)
join users on groups_users.userId = users.id

如果您需要组名,也可以加入。

这是另一种方式:

select *
from groups_users
join users on group_users.userId = users.id
where groups_users.gropId in (select groupId from groups_users where userId = ?)

您可以要求您的数据库创建 json-输出:

WITH cte(j) AS (
    SELECT
        jsonb_build_object(
                    'id'    , groupid
                ,   'name'  , name
                ,   'users' , json_agg(json_build_object(
                        'id'    , users.id
                    ,   'name'  , users.username
                    ,   'email' , users.email
                )
            )
        )
    FROM    groups_users
        JOIN    users ON users.id = userId
        JOIN    groups ON groups.id = groupId
    GROUP BY
        groupid, groups.id, groups.name
)
SELECT  json_agg(j)
FROM    cte;