Объединение двух соединенных таблиц и вывод в виде JSON? - PullRequest
1 голос
/ 17 мая 2019

Я хочу SELECT сущностей и столбец массива JSON uploads, содержащий все их загрузки, а также поля cover и profile для каждой загрузки.

Пока что я могу получить массив загрузок, но я не могу добавить два других поля из таблицы entitiesXuploads.

Базовое представление моих трех таблиц таково:

Entities

  • id (int8)
  • имя (варчар)

Uploads

  • id (uuid)
  • title (varchar)
  • версии (jsonb)

entitiesXuploads

  • entityId (int8)
  • uploadId (uuid)
  • обложка (bool)
  • профиль (bool)

Мой запрос:

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

Возвращает строки с:

  • id (id объекта)
  • имя (название сущности)
  • загрузок (массив загрузок json)

1 Ответ

1 голос
/ 17 мая 2019

demo: db <> fiddle

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(), чтобы объединить эти объекты в один массив.

...