Создать запрос родитель-потомок из отношения многие-ко-многим - PullRequest
0 голосов
/ 12 июля 2020

Добрый день, мне сложно создать запрос в Postgres, чтобы получить отношение «многие ко многим» в форме «родитель-потомок». Есть две таблицы:

  1. 'Проекты' таблица проектов
  2. 'Услуги' таблица услуг

Они связаны с третьей таблицей project_service служба_проекта

Запрос SELECT projects.id_project, projects.title, projects.level, services.id_service, services.service FROM projects, services, project_service WHERE projects.id_project = project_service.id_project AND services.id_service = project_service.id_service возвращает эту таблицу: таблица результатов запроса

Как написать запрос, чтобы получить эту таблицу в форме «родитель-потомок», вот так:

[
{ "id": "1000", "level": "Projects", "title": "Project 1", "children": [
    { "id": "2000", "service": "Service 1},
    { "id": "2001", "service": "Service 2},
    { "id": "2002", "service": "Service 3},
    { "id": "2003", "service": "Service 4}
]},

{ "id": "1001", "level": "Projects", "title": "Project 2", "children": [
    { "id": "2004", "service": "Service 5}
]}]

Спасибо за помощь

1 Ответ

0 голосов
/ 12 июля 2020

Это вы имеете в виду?

 with svc_json as (
  select id_service, to_jsonb(services) as svc
    from services
), together as (
  select p.*, jsonb_agg(s.svc) as children  
    from project_service ps
    join svc_json s on s.id_service = ps.id_service
    join projects p on p.id_project = ps.id_project
   group by p.id_project, p.title, p.level
)
select jsonb_pretty(jsonb_agg(to_jsonb(together)))
  from together;

              jsonb_pretty               
-----------------------------------------
 [                                      +
     {                                  +
         "level": "Projects",           +
         "title": "Project 1",          +
         "children": [                  +
             {                          +
                 "service": "Service 1",+
                 "id_service": 2000     +
             },                         +
             {                          +
                 "service": "Service 2",+
                 "id_service": 2001     +
             },                         +
             {                          +
                 "service": "Service 3",+
                 "id_service": 2002     +
             },                         +
             {                          +
                 "service": "Service 4",+
                 "id_service": 2003     +
             }                          +
         ],                             +
         "id_project": 1000             +
     },                                 +
     {                                  +
         "level": "Projects",           +
         "title": "Project 2",          +
         "children": [                  +
             {                          +
                 "service": "Service 5",+
                 "id_service": 2004     +
             }                          +
         ],                             +
         "id_project": 1001             +
     }                                  +
 ]
(1 row)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...