2017-02-12 26 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語句,一些典型數據和預期輸出。 –