2017-10-07 7 views
1

私はこれらのテーブルSQLクエリ

destination (id integer, name text) 
activity (id integer, name text, destination_id integer) 
activity_duration (value numeric, unit text, label text, activity_id integer) 
activity_duration_price(amount numeric, currency_id integer, activity_duration_id integer) 

を持つ各宛先は、1つの以上の活性を持って、各アクティビティは、1つのまたはそれ以上の期間を有し、各期間は、1つの価格を持っています。

は、ここに私のクエリ

select 
    d.id destination_id, 
    d.name destination_name, 
    count(a.id) as nb_activity, 
    string_agg('{"id":'||a.id||',"name":"'||a.name||'","pictures":"'||a.pictures||'","meta":{"price":'||amount||',"label":"'||label||'"}}',',') activities 
from destination d 
    left join activity a on (a.destination_id = d.id) 
    left join activity_duration ad on (activity_id = a.id) 
    left join activity_duration_price adp on (adp.activity_duration_id = ad.id) 
where d.id = any (array[142]) group by d.id, d.name order by nb_activity desc 

であり、これはあなたが見ることができるように、メタ情報は、同じ項目のために二回ありstring_agg

[{ 
    "id": 2, 
    "name": "visit tokyo", 
    "meta": { 
     "price": 210, 
     "label": "Adult" 
    } 
}, { 
    "id": 2, 
    "name": "visit tokyo", 
    "pictures": "{}", 
    "meta": { 
     "price": 170, 
     "label": "Children" 
    } 
}] 

ための結果です。

私はstring_aggのための私の結果は、私がこのような結果を得ることができますどのようにこの

[{ 
    "id": 2, 
    "name": "visit tokyo", 
    "meta": [{ 
      "price": 210, 
      "label": "Adult" 
     }, 
     { 
      "price": 170, 
      "label": "Children" 
     } 
    ] 
}] 

のようになりたいですか?

+0

テーブルには記載されていない「amount」や「label」のようなフィールドがあります。 – Dmitry

+0

ありがとう!私は私のポストを編集 – Rony

答えて

1

array_agg - 行

array_to_jsonの配列を作成する - JSON配列

を作成するためには、次にテキストにJSON配列をキャスト。

SELECT 
    d.id destination_id, 
    d.name destination_name, 
    count(a.id) AS nb_activity, 
    string_agg('{"id":'||a.id||',"name":"'||a.name||'","pictures":"'||a.pictures||'","meta":'|| 
      (
       SELECT array_to_json(array_agg(t))::TEXT --cast to TEXT to concatenate to the string 
       FROM 
       (
       SELECT 
        adp.amount, 
        ad.label 
       FROM activity a2 
        LEFT JOIN activity_duration ad ON (ad.activity_id = a2.id) 
        LEFT JOIN activity_duration_price adp ON (adp.activity_duration_id = ad.id) 
       ) AS t 
      ) 
      ||'}' 
    ,',' 
) AS activities 
FROM destination d 
    LEFT JOIN activity a ON (a.destination_id = d.id) 
WHERE d.id = ANY (ARRAY[142]) GROUP BY d.id, d.name ORDER BY nb_activity DESC 
+0

うわー!それは最高です!ありがとう。 array_to_json関数は素晴らしいです! – Rony

+0

あなたは大歓迎です。 – Dmitry