2016-08-25 120 views
0

過去幾天我一直在爲查詢而苦苦掙扎,我希望有人能夠提供幫助。我有3個表: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) 
); 

我想運行一個查詢,這樣我可以回到它具有JSON格式,像這樣一個對象:

{ 
    "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; 

編輯:

我現在有這裏面正確返回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

Got it!希望它可以幫助別人:

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;