Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgres为每个查询创建一个JSON对象_Json_Postgresql - Fatal编程技术网

Postgres为每个查询创建一个JSON对象

Postgres为每个查询创建一个JSON对象,json,postgresql,Json,Postgresql,如果我用错误的方式处理/解释这个问题,请原谅我 我有一个表格,里面有关于我们在网站上发布的文章的信息 我想做的是创建一个JSON对象,它根据“sub_speciality_id”进行分类,并显示每个对象的3篇最新文章 所以本质上看起来是这样的 对于每篇文章,我们都有一个id、新闻类型id、标题和子主题id 因此,本质上我想选择我可以使用的不同sub_-id /* selecting the sub_speciality ids where an article exists */ select

如果我用错误的方式处理/解释这个问题,请原谅我

我有一个表格,里面有关于我们在网站上发布的文章的信息

我想做的是创建一个JSON对象,它根据“sub_speciality_id”进行分类,并显示每个对象的3篇最新文章

所以本质上看起来是这样的

对于每篇文章,我们都有一个id、新闻类型id、标题和子主题id

因此,本质上我想选择我可以使用的不同sub_-id

/* selecting the sub_speciality ids where an article exists */
select DISTINCT(sub_speciality_id) from news_item where news_type_id = 1 AND sub_speciality_id is not null
然后对于每个sub_特性,我想使用它生成一个JSON对象,就像

SELECT json_agg(row_to_json(r))
FROM
(select * from news_item where news_type_id = 1 AND sub_speciality_id =replace_me ORDER BY create_dt DESC LIMIT 3)r
但是,将“替换我”替换为每个

所以我猜它看起来像(尽管我确信我在格式化时犯了一些错误):

数据集:

CREATE TABLE t (sub_speciality_id INTEGER, news_type_id INTEGER, title TEXT, content TEXT);

INSERT INTO t
VALUES
  (1, 1, 'a', 'some text a'),
  (1, 2, 'b', 'some text b'),
  (2, 1, 'c', 'some text c'),
  (1, 1, 'd', 'some text d'),
  (2, 2, 'e', 'some text e'),
  (2, 1, 'f', 'some text f');
查询:

SELECT JSON_BUILD_OBJECT('sub_specialities', JSON_OBJECT_AGG(sub_speciality_id, item))
FROM (
  SELECT sub_speciality_id, JSON_AGG(ROW_TO_JSON(t)) AS item
  FROM t
  WHERE news_type_id = 1
  GROUP BY sub_speciality_id
) AS j
返回(修饰后):


我试着用“news\u item”替换“t”,但我得到了
错误:列“t”不存在第3行:选择子项id,JSON\U AGG(行到行JSON(t))作为项
如果我也替换另一个“t”,我会得到
错误:字段名不能为空SQL状态:22023
@Charlie您可能有一些记录,其中
子属性id
为空。所以您需要决定如何处理它,因为您正在使用该值作为字段名。如果要排除它们,请将WHERE更改为
,其中news\u type\u id=1,sub\u speciality\u id不为NULL
,否则将其合并,例如
选择COALESCE(sub\u speciality\u id,0)作为sub\u speciality\u id,JSON\u AGG(…)。。。按合并分组(子专业id,0)
非常感谢。还有一个问题-我如何按顺序和限制,使每个子专业只有3个结果?@Charlie需要更多的子查询才能做到这一点;首先,每个sub_speciality_id获取一个行号,以便每个sub_speciality_id仅获取3个项目;然后再执行另一个子查询以获取不带行号的行,因为否则该值将位于json对象中。无论如何,你可以在这里看一看:我已经按标题对LIMIT进行了排序(在行数位中),但当然,在决定要获得哪3个时,你会根据你想要排序的任何字段进行排序。
SELECT JSON_BUILD_OBJECT('sub_specialities', JSON_OBJECT_AGG(sub_speciality_id, item))
FROM (
  SELECT sub_speciality_id, JSON_AGG(ROW_TO_JSON(t)) AS item
  FROM t
  WHERE news_type_id = 1
  GROUP BY sub_speciality_id
) AS j
{
    "sub_specialities": {
        "1": [{
            "sub_speciality_id": 1,
            "news_type_id": 1,
            "title": "a",
            "content": "some text a"
        }, {
            "sub_speciality_id": 1,
            "news_type_id": 1,
            "title": "d",
            "content": "some text d"
        }],
        "2": [{
            "sub_speciality_id": 2,
            "news_type_id": 1,
            "title": "c",
            "content": "some text c"
        }, {
            "sub_speciality_id": 2,
            "news_type_id": 1,
            "title": "f",
            "content": "some text f"
        }]
    }
}