从多对多关系创建父子查询

时间:2020-07-11 21:15:30

标签: sql postgresql

早上好, 我很难在Postgres中创建查询以获取父子形式的多对多关系。 有两个表:

  1. “项目”
    projects table
  2. “服务”
    services table

它们与第三个project_service表连接
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返回此表:
query result table

如何编写查询以获取像这样的亲子形式的表格:

[
{ "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 :(得分:0)

这是您的意思吗?

 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)
相关问题