2016-09-18 29 views
0

PostgreSQLの関数に左結合を使用して2つのテーブルからカスタムjsonを構築しようとしていますが、機能しません。JSONオブジェクト内のPostgreSQLの配列

テーブル構造:

ポスト

id | title | description 

postPhoto

id | postId (FK) | name 

JSON例:

{ 
    postId: 1, 
    title: '' 
    description: '', 
    postPhotos: [ 
     {id: 1, name: 'photo1.png'}, 
     {id: 1, name: 'photo2.png'}, 
    ] 
} 

SQL関数:

$BODY$DECLARE 
    success boolean; 
    msg text; 
    var_most_recent json; 
BEGIN 


SELECT to_json(array_agg(t)) INTO var_most_recent FROM (

    SELECT * 
     (SELECT to_json(array_agg(t)) FROM (
       SELECT * FROM postPhoto AS PP WHERE post.id = PP."postId" 
      )t) 
    FROM post 
    ORDER BY id DESC LIMIT 10 

)t; 

success = TRUE; msg = 'Successfully Returned Post data'; 
RETURN (SELECT json_build_object(
    'success', success, 
    'msg', msg, 
    'body', json_build_object(
     'mostRecent', var_most_recent 
    ) 
)); 

END;$BODY$ 

答えて

1

私はあなたがjson_agg集計機能が欠けていると思います。

SELECT json_agg(p) 
FROM 
    (SELECT 
     json_build_object(
      'postId', post.id, 
      'title', post.title, 
      'description', post.description, 
      'postPhotos', 
       (SELECT json_agg(json_build_object('id',id,'name',name)) 
       FROM postPhoto WHERE postId=post.id) 
     ) AS p 
    FROM post 
    ORDER BY post.id 
    LIMIT 10) as t 
WHERE json_array_length(p->'postPhotos')>1; 
+0

これは動作しますが、私はそうJSONは次のようになり10でLIMITを持ってどこがいけない原因私は、アレイ内の複数の記事をラップする必要があります:ここで私はそれを行うだろうかだ のhttp:/ /pastebin.com/W3MSm8fh – Jazzy

+0

問題はありません。別の 'SELECT'クエリでラップするだけです。更新された答えを見てください。 – redneb

+0

postphotoがnullでない投稿を選択するのに手伝ってもらえますか – Jazzy

関連する問題