2016-08-25 1 views
0

Я боролся с запросом в течение последних нескольких дней, и я надеюсь, что кто-то может помочь. У меня есть 3 таблицы:Postgres Множество-много-много JSON Aggregation

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; 

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;