合并两个联接表并输出为 JSON?
Merging two joined tables and output as JSON?
我想要 SELECT
个实体和一个 uploads
JSON 包含所有上传内容的数组列,以及 cover
和 profile
字段每次上传。
到目前为止,我可以获得上传的数组,但是我无法从 entitiesXuploads
table.
添加另外两个字段
我的三个tables的基本表示如下:
Entities
- id (int8)
- 名称(可变字符)
Uploads
- id (uuid)
- 标题(可变字符)
- 版本 (jsonb)
entitiesXuploads
- entityId (int8)
- uploadId (uuid)
- 覆盖(布尔)
- 配置文件(布尔值)
我的查询:
SELECT
e.id,
e.name,
COALESCE(jsonb_agg(up) FILTER (WHERE up."id" IS NOT NULL), '[]') as uploads
FROM
entities as e
LEFT JOIN "entitiesXuploads" as exu ON exu."entityId" = e."id"
LEFT JOIN "uploads" as up ON up."id" = exu."uploadId"
GROUP BY
e.id,
e.name
其中 returns 行:
- id(实体id)
- 名称(实体名称)
- 上传(json 上传数组)
SELECT
e.id,
e.name,
jsonb_agg(
jsonb_build_object(
'upload_id', upload_id,
'title', title,
'versions', versions,
'cover', cover,
'profile', profile
)
) AS uploads
FROM
entities e
JOIN entities_uploads eu ON e.id = eu.entity_id
JOIN uploads u ON eu.upload_id = u.id
GROUP BY e.id, e.name
您可以使用 jsonb_build_object()
为每条记录创建您期望的对象。之后,您可以使用 jsonb_agg()
聚合函数对记录进行分组,将这些对象合并到一个数组中。
我想要 SELECT
个实体和一个 uploads
JSON 包含所有上传内容的数组列,以及 cover
和 profile
字段每次上传。
到目前为止,我可以获得上传的数组,但是我无法从 entitiesXuploads
table.
我的三个tables的基本表示如下:
Entities
- id (int8)
- 名称(可变字符)
Uploads
- id (uuid)
- 标题(可变字符)
- 版本 (jsonb)
entitiesXuploads
- entityId (int8)
- uploadId (uuid)
- 覆盖(布尔)
- 配置文件(布尔值)
我的查询:
SELECT
e.id,
e.name,
COALESCE(jsonb_agg(up) FILTER (WHERE up."id" IS NOT NULL), '[]') as uploads
FROM
entities as e
LEFT JOIN "entitiesXuploads" as exu ON exu."entityId" = e."id"
LEFT JOIN "uploads" as up ON up."id" = exu."uploadId"
GROUP BY
e.id,
e.name
其中 returns 行:
- id(实体id)
- 名称(实体名称)
- 上传(json 上传数组)
SELECT
e.id,
e.name,
jsonb_agg(
jsonb_build_object(
'upload_id', upload_id,
'title', title,
'versions', versions,
'cover', cover,
'profile', profile
)
) AS uploads
FROM
entities e
JOIN entities_uploads eu ON e.id = eu.entity_id
JOIN uploads u ON eu.upload_id = u.id
GROUP BY e.id, e.name
您可以使用 jsonb_build_object()
为每条记录创建您期望的对象。之后,您可以使用 jsonb_agg()
聚合函数对记录进行分组,将这些对象合并到一个数组中。