2016-08-25 9 views
0

私は過去数日間のクエリに苦労しています。私は誰かが助けることを望んでいます。私は3つのテーブルがあります:私は、私はそうのようなJSON形式を持つ単一のオブジェクトを返すことができるようにクエリを実行しようとしていますPostgres多対多JSON集約

CREATE TABLE user (
    ID SERIAL PRIMARY KEY, 
    USERNAME TEXT NOT NULL UNIQUE 
); 

CREATE TABLE skill (
    ID SERIAL PRIMARY KEY, 
    NAME TEXT NOT NULL 
); 

CREATE TABLE user_skill (
    ID SERIAL PRIMARY KEY, 
    USER_ID INTEGER REFERENCES user(id), 
    SKILL_ID INTEGER REFERENCES skill(id) 
); 

を:私はこれまでのところ、このようになります持っているもの

{ 
    "id": 1, 
    "username": "test123", 
    "skills": [{ 
     "name": "skillOne" 
    }, { 
     "name": "skillTwo" 
    }, { 
     "name": "skillThree" 
    }] 
} 

SELECT 
    json_build_object(
     'id', u.id, 
     'username', u.username, 
     'skills', jsonb_agg(skill) 
    ) 
FROM (
    SELECT 
     jsonb_build_object(
      'name', s.name 
     ) skill 
    FROM user_skill us 
    JOIN skill s ON us.skill_id = s.id 
) xombi_user u; 

EDIT:

私が正しくJSON配列を返しますが、今で構築する必要がある、これを持っていますその中から一つのjsonオブジェクトを取り出します。

SELECT u.id, u.username, jsonb_agg(s) 
    FROM user u 
    LEFT JOIN user_skill us ON u.id = us.user_id 
    LEFT JOIN skill s ON us.skill_id = s.id 
    WHERE u.id = 60 
GROUP BY u.id; 

答えて

0

これを取得しました!それが誰かを助けることを願って:

SELECT 
    json_build_object(
     'id', u.id, 
     'username', u.username, 
     'skills', jsonb_agg(s) 
    ) 
    FROM user u 
    LEFT JOIN user_skill us ON u.id = us.user_id 
    LEFT JOIN skill s ON us.skill_id = s.id 
    WHERE u.id = 60 
GROUP BY u.id;