Sql 如何同时加载2个相关数据集?(即帖子和评论)

Sql 如何同时加载2个相关数据集?(即帖子和评论),sql,postgresql,node-postgres,Sql,Postgresql,Node Postgres,我是pg的新手,我正在尝试找出最好的方法是将一组帖子及其相关评论加载到一起 例如: 我正在尝试获取与所有这些帖子相关的10篇帖子和评论,比如facebooks wall,在这里,你可以看到一个相同页面上加载的帖子和评论提要。我的模式如下所示: Posts -------- id - author - description - date - commentCount Comments ------- id - post_id - author - descr

我是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是一篇帖子的评论数但是,第一个解决方案是,在获取数据后,我可以始终在节点中将其过滤掉

另外,当我尝试使用group by posts.id(以便于在节点中遍历)时,我会遇到以下错误:

column "comments.id" must appear in the GROUP BY clause or be used in an aggregate function
ERROR:  subquery must return only one column
LINE 1: SELECT (
               ^
QUERY:  SELECT (
        SELECT * 
        FROM Comments
        WHERE Comments.id = 38
    )
我可以尝试的第二件事是发送一个post_id数组,我想加载它,让pg_函数加载并发送回去,但我不能正确地执行查询:

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;
但是,即使尝试从一个索引中获取值,我也会出现以下错误:

column "comments.id" must appear in the GROUP BY clause or be used in an aggregate function
ERROR:  subquery must return only one column
LINE 1: SELECT (
               ^
QUERY:  SELECT (
        SELECT * 
        FROM Comments
        WHERE Comments.id = 38
    )
最后,最后一个解决方案是简单地分别调用N个postgres,其中N是带有注释的帖子数量,因此如果我有5个带有注释的帖子,我将使用post_id调用5个postgres,并从注释表中选择

我真的不知道在这里该做什么,任何帮助都将不胜感激


感谢将所有评论作为每个帖子的记录数组:

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

第一种解决方案是最简单和最快的。另一个将需要两次查询和两次服务器访问。关于重复文章这就是关系数据库的方式,这是一个“问题”,最好在表示层处理。你只使用sql吗?我使用postgres和node@ClodoaldoNeto是否仍然可以在不显示聚合错误的情况下使用group by?是否希望每个帖子都有一个记录数组?