json - Postgres 多对多 JSON 聚合

标签 json postgresql nested

过去几天我一直在为一个查询而苦苦挣扎,我希望有人可以提供帮助。我有3张 table :

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;

最佳答案

知道了!希望它可以帮助某人:

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;

关于json - Postgres 多对多 JSON 聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39135160/

相关文章:

java - 使用 Java EE 7/Glassfish 4.1 对 JSON 进行编码(marshal)处理/解封处理导致空对象

javascript - 无法验证 json_decode 关联数组元素

python - pyparsing 中的 python 列表(嵌套)解析器是什么样的?

java - 如何修改此代码以使其在 Android API 3.0 上运行?

ruby - 哪个 Ruby ORM 支持 PostgreSQL 数组数据类型?

python - 从 XSD 生成 Python 类和 SQLAlchemy 代码以将 XML 存储在 Postgres 上

PostgreSQL UTC 至 英国本地时间

java - Kotlin:从嵌套的 Java 类继承

python - 如何在 Python 中从包含 N 行的 csv 文件创建嵌套字典

json - 使用jq合并json文件,获取文件列表长度太长报错