如何将2个相关数据集加载在一起?(即发布和评论)



我是PG的新手,并试图弄清楚哪种最佳方法是将一组帖子及其相关的注释加载在一起。

例如:我正在尝试获取与所有这些帖子相关的10篇文章和评论,例如Facebooks Wall,您可以在同一页面上看到加载的帖子和评论的提要。我的模式看起来像这样:

Posts
--------
id  -  author   -  description  -  date   -  commentCount 
Comments
-------
id  -   post_id  -  author  -  description   -   date

我试图在同一Postgres函数上加载帖子和评论:

select *
from posts
LEFT join comments on posts.id = comments.post_id

不幸的是,它复制了存在评论的帖子n,其中n是帖子的评论数量。但是,第一个解决方案是我可以在获取数据

之后始终将其过滤掉。

同样,当我尝试通过posts.id使用组时(为了使节点更容易穿越),我会收到以下错误:

column "comments.id" must appear in the GROUP BY clause or be used in an aggregate function

第二我可以尝试的事情是发送我想要加载并具有pg_function加载的post_ids并将其发送回去,但我无法完全查询:

CREATE OR REPLACE FUNCTION "getPosts"(postIds int[])
  RETURNS text AS
$BODY$
BEGIN
    RETURN (
        SELECT * 
        FROM Comments
        WHERE Comments.id = postIds[0]
    );
END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

称其为:

SELECT n FROM "public"."getPosts"(array[38]) As n;

但是,即使尝试从一个索引获得值时,我也会收到以下错误:

ERROR:  subquery must return only one column
LINE 1: SELECT (
               ^
QUERY:  SELECT (
        SELECT * 
        FROM Comments
        WHERE Comments.id = 38
    )

最后,最后一个解决方案是简单地对postgres进行单独呼叫,其中n是带有注释的帖子数,因此,如果我有5个带有评论的帖子,我会给Postgres提供5个电话post_id并从评论表中进行选择。

我真的不确定在这里做什么,任何帮助将不胜感激。

谢谢

将所有注释作为每个帖子的记录数组:

select
    p.id, p.title, p.content, p.author,
    array_agg(c) as comments
from
    posts p
    left join
    comments c on p.id = c.post_id
group by 1, 2, 3, 4

或每个注释列的一个数组:

select
    p.id, p.title, p.content, p.author,
    array_agg(c.author) as comment_author,
    array_agg(c.content) as comment_content
from
    posts p
    left join
    comments c on p.id = c.post_id
group by 1, 2, 3, 4

最新更新