【问题标题】:Postgres Result Multidimensional from Query来自查询的 Postgres 结果多维
【发布时间】:2018-07-24 00:59:48
【问题描述】:

如何从单个 Postgres 查询创建多维数组。

我有 3 个包含以下列的表格:

  • tb_school (id, school_name) 例如:

    [ {id:"1", school_name:"School1"}, {id:"2", school_name:"School2"} ]

  • tb_profile (id, profile_name, school_id) 例如:

    [ {id:"1", profile_name:"John", school_id:"1"}, {id:"2", profile_name:"Peter", school_id:"1"}, {id:"3", profile_name:"Sam", school_id:"1"}, {id:"4", profile_name:"Susan", school_id:"2"}, {id:"5", profile_name:"Jude", school_id:"2"}, {id:"6", profile_name:"Kim", school_id:"2"} ]

  • tb_article(id、article_name、profile_id) 例如:

    [ {id:"1", article_name:"Headline News", profile_id:"1"}, {id:"2", article_name:"Sports Recap", profile_id:"2"}, {id:"3", article_name:"Weather", profile_id:"3"}, {id:"4", article_name:"Arts", profile_id:"4"}, {id:"5", article_name:"Other", profile_id:"5"}, {id:"6", article_name:"Example", profile_id:"6"} ]

我希望查询返回结果 lat 看起来像这样:

[
    {school_name:"School1", people:[
        {profile_name:"John", articles:[
            article_name:"Headline News"
        ]},
        {profile_name:"Peter", articles:[
            article_name:"Sports Recap"
        ]},
        {profile_name:"Sam", articles:[
            article_name:"Weather"
        ]},
    ]},
    {school_name:"School2", people:[
        {profile_name:"Susan", articles:[
            article_name:"Arts"
        ]},
        {profile_name:"Jude", articles:[
            article_name:"Other"
        ]},
        {profile_name:"Kim", articles:[
            article_name:"Example"
        ]},
    ]}
]

我知道可以通过嵌套 for 循环中的 3 个单独的选择查询来实现这一点。我想知道的是,这可以通过一个 postgres 查询来实现吗?

【问题讨论】:

  • 您还应该给我们提供表格中的示例数据。
  • @RaymondNijland 请查看更新后的问题。我为每个表添加了示例 JSON。提前谢谢你

标签: javascript sql arrays postgresql multidimensional-array


【解决方案1】:

注意:我不擅长 PostgreSQL。可能做了错误的假设,代码可能不适合生产。

我几乎可以肯定你不能只生成一个嵌套对象。但是您可以接收 JSON。所以

SELECT 
	json_build_object(
	  'school_name', school_name,
	  'people', (
		  SELECT 
		  	json_agg(json_build_object(
		  		'profile_name', profile_name,
		  		'articles', (
		  			SELECT 
		  				json_agg(json_build_object(
		  					'article_name', article_name
		  				))
		  			FROM tb_article
		  			WHERE profile_id = tb_profile.facid
		  		) 
		  	))
		  FROM tb_profile
		  WHERE school_id = tb_school.id
		 )
	) AS result
FROM tb_school

它将为您提供 JSON 格式的行,您可以使用JSON.parse

如果你想测试你可以使用this learning service。我在这段代码中使用了它。

SELECT 
	json_build_object(
	  'name', firstname,
	  'slots', (
		  SELECT 
		  	json_agg(json_build_object(
		  		'number', slots,
		  		'facility', (
		  			SELECT 
		  				json_agg(json_build_object(
		  					'name', name
		  				))
		  			FROM cd.facilities
		  			WHERE facid = cd.bookings.facid
		  		) 
		  	))
		  FROM cd.bookings
		  WHERE memid = cd.members.memid
		 )
	) AS result
FROM cd.members

这可能会有所帮助或提供更多想法。

【讨论】:

  • 哇,太棒了!非常感谢您的快速回复和所有努力。正是我想要的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 2011-06-30
  • 2017-09-28
  • 1970-01-01
相关资源
最近更新 更多