2017-02-12 47 views
0

我有一个关于Postgres中横向连接的问题。Postgres横向加入多个表来限制结果

我的用例是我想返回一个数据集合并多个表,但限制返回的出版物和评论的数量。简化的表架构低于

表作者

  • ID
  • NAME

表评分

  • ID
  • AUTHOR_ID
  • PUBLICATION_ID
  • CONTENT

表公开

  • ID
  • NAME

表AuthorPublication

  • AUTHOR_ID
  • PUBLICATION_ID

所以对于我的初始查询我有这样的:

SELECT a.id, a.name json_agg ( json_build_object ( 'id', r.id, 'content', r.content ) ) AS reviews, json_agg ( json_build_object( 'id', p.id, 'name', p.name ) ) AS publications FROM public.author a INNER JOIN public.review r ON r.author_id = a.id INNER JOIN public.author_publication ap ON ap.author_id = a.id INNER JOIN public.publication p ON p.id = ap.publication_id WHERE a.id = '1' GROUP BY a.id

这将返回我需要的数据,例如我得到作者的名字,id以及他们所有的评论和出版物的列表。我想要做的是限制评论和出版物的数量。例如,返回5个评论和3个出版物。

我试着用横向查询来做这件事,但是我遇到了一个问题,如果我做了一个横向查询,它按照预期工作。

所以像:

INNER JOIN LATERAL (SELECT r.* FROM public.review r WHERE r.author_id = a.id LIMIT 5) r ON TRUE 这将返回只有5的评论集 - 但如果我添加第二个横向查询

INNER JOIN LATERAL (SELECT ap.* FROM public.author_publication ap WHERE ap.author_id = a.id LIMIT 5) r ON TRUE

我现在得到25个结果审核并发布与重复/重复的数据。

所以我的问题是你是否允许在单个PG查询中有多个横向连接,如果不是,限制JOIN结果数量的好方法是什么?

谢谢!

回答

0

您必须查询更改为类似这样:

SELECT 
    a.id, 
    a.name, 
    (
    SELECT 
     json_agg (r) 
     FROM (
      SELECT 
        json_build_object (
         'id', r.id, 
         'content', r.content 
       ) AS r 
       FROM public.review r 
       WHERE r.author_id = a.id 
       ORDER BY r.id 
       LIMIT 5 
      ) AS a 
) AS reviews, 
    (
    SELECT 
     json_agg (p) 
    FROM (
      SELECT 
       json_build_object(
        'id', p.id, 
        'name', p.name 
       ) AS p 
       FROM public.author_publication ap 
      INNER JOIN public.publication p ON p.id = ap.publication_id 
      WHERE ap.author_id = a.id 
      ORDER BY p.id 
      LIMIT 3 
     ) AS a 
    ) AS publications 
FROM 
    public.author a 
WHERE 
    a.id = '1' 
+0

当我更新我的查询到你的建议,我得到以下错误: ''' 列“r.id”必须出现在GROUP BY子句或在聚合函数 ''' 可以使用和添加GROUP BY给我: ''' [ERR] ERROR:由用作表达一个子查询返回多于一行 ' '' 但是,如果我只限于1,那么我只能得到一个结果。 – KukicAdo

+0

我发现的另一个有趣的事情是运行以下查询: '''SELECT json_agg(r.uuid)FROM public.review r WHERE r.author_uuid ='b3113a70-e4bf-4b30-a9ca-9b0530a3115b'LIMIT 1 ''' Creates创建一个包含所有匹配字段的json数组。 但是,如果我删除json_agg,我只会得到第一个字段的1行。 – KukicAdo

+0

对不起,编写没有db结构的查询是不方便的。当你问下一个问题时 - 请提供CREATE TABLE语句,一些典型数据和预期输出。 –