如何一起加载 2 个相关数据集? (即帖子和评论)
how to load 2 related datasets together? (i.e posts and comments)
我对 pg 还很陌生,我想找出最好的方法是一起加载一组 post 及其相关评论。
例如:
我正在尝试获取 10 个 posts 和与所有这些 posts 相关的评论,例如 facebook 墙,您可以在其中看到 posts 的提要和加载在同一页面上的评论。我的架构看起来像这样:
Posts
--------
id - author - description - date - commentCount
Comments
-------
id - post_id - author - description - date
我尝试在同一个 postgres 函数上加载 posts 和评论,执行以下操作:
select *
from posts
LEFT join comments on posts.id = comments.post_id
不幸的是,它在评论存在的地方重复了 posts N 次,其中 N 是 post 拥有的评论数。 但是,第一个解决方案是我总是可以在获取数据后在Node中过滤掉它
另外,当我尝试使用 group by posts.id(以便更容易在节点中遍历)时,我收到以下错误:
column "comments.id" must appear in the GROUP BY clause or be used in an aggregate function
我可以尝试的第二个是发送一个post_ids的数组我想加载并让pg_function加载并将它们发回,但是我不能完全正确的查询:
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 次单独调用,其中 N 是带有注释的 post 的数量,因此,如果我有 5 个 post 带有评论,我会使用评论 table.
中的 post_id 和 select 对 postgres 进行 5 次调用
我真的不知道该怎么做,如有任何帮助,我们将不胜感激。
谢谢
将所有评论作为每个 post:
的记录数组
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
我对 pg 还很陌生,我想找出最好的方法是一起加载一组 post 及其相关评论。
例如: 我正在尝试获取 10 个 posts 和与所有这些 posts 相关的评论,例如 facebook 墙,您可以在其中看到 posts 的提要和加载在同一页面上的评论。我的架构看起来像这样:
Posts
--------
id - author - description - date - commentCount
Comments
-------
id - post_id - author - description - date
我尝试在同一个 postgres 函数上加载 posts 和评论,执行以下操作:
select *
from posts
LEFT join comments on posts.id = comments.post_id
不幸的是,它在评论存在的地方重复了 posts N 次,其中 N 是 post 拥有的评论数。 但是,第一个解决方案是我总是可以在获取数据后在Node中过滤掉它
另外,当我尝试使用 group by posts.id(以便更容易在节点中遍历)时,我收到以下错误:
column "comments.id" must appear in the GROUP BY clause or be used in an aggregate function
我可以尝试的第二个是发送一个post_ids的数组我想加载并让pg_function加载并将它们发回,但是我不能完全正确的查询:
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 次单独调用,其中 N 是带有注释的 post 的数量,因此,如果我有 5 个 post 带有评论,我会使用评论 table.
中的 post_id 和 select 对 postgres 进行 5 次调用我真的不知道该怎么做,如有任何帮助,我们将不胜感激。
谢谢
将所有评论作为每个 post:
的记录数组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