如何进行查询以获取用户的所有组,显示每个组拥有的用户(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;
这个问题我一开始觉得很简单,但是一直没能解决。
我得到了一个 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;