如何查询和获取关系中的所有数据作为对象数组? Mysql

问题描述 投票:0回答:1

假设我有三张桌子
主表

+----+------+---------------------+
| id | name | create_at           |
+----+------+---------------------+
|  1 | jack | 2023-04-26 22:01:37 |
|  2 | tom  | 2023-04-26 22:01:37 |
+----+------+---------------------+

与主表相关的第二个表

+----+----------------+--------+---------------------+
| id | companyuser_id | name   | create_at           |
+----+----------------+--------+---------------------+
|  1 |              1 | Amazon | 2023-04-26 22:47:21 |
+----+----------------+--------+---------------------+

与第二张表有关系的第三张表

+----+------------+------------------------+---------------------+
| id | company_id | feedback               | create_at           |
+----+------------+------------------------+---------------------+
|  1 |          1 | i like this company    | 2023-04-26 22:58:04 |
|  2 |          1 | i dislike this company | 2023-04-26 22:58:04 |
+----+------------+------------------------+---------------------+

如何查询以获取所有数据作为这样的对象数组?

  [
    {
        "user": "user1",
        "companies": [
            {
                "name": "company1",
                "feedback": [
                    {
                        "comment": "comment1",
                        "feedback_id": "1"
                    },
                    {
                        "comment": "comment2",
                        "feedback_id": "2"
                    }
                ]
            }
        ]
    }
  ]

这是我使用 JSON_ARRAY 和 JSON_OBJECT 尝试过的

SELECT
    JSON_ARRAY(
        JSON_OBJECT(
            "user",
            cu.name,
            "companies",
            JSON_ARRAY(
                JSON_OBJECT(
                    "name",
                    c.name,
                    "feedbacks",
                    JSON_ARRAY(
                        JSON_OBJECT(
                            "feedback",
                            f.feedback,
                            "id",
                            f.id
                        )
                    )
                )
            )
        )
    )
FROM companyuser as cu
    JOIN company c ON c.companyuser_id = cu.id
    JOIN feedback f ON f.company_id = c.id
GROUP BY cu.id;

然而反馈的结果只返回一个而不是两个 这是我尝试过的查询的输出
输出:

[
    {
        "user": "jack",
        "companies": [
            {
                "name": "Amazon",
                "feedbacks": [
                    {
                        "id": 1,
                        "feedback": "i like this company"
                    }
                ]
            }
        ]
    }
]

我想要的输出是:

[
    {
        "user": "jack",
        "companies": [
            {
                "name": "Amazon",
                "feedbacks": [
                    {
                        "id": 1,
                        "feedback": "i like this company"
                    },
                    {
                        "id": 2,
                        "feedback": "i dislike this company"
                    },
                ]
            }
        ]
    }
]
sql mysql arrays json aggregate-functions
1个回答
0
投票

表之间存在一对多关系,因此您需要聚合它们 - 也就是说,基本上使用

json_arrayagg
而不是
json_array)
.

这是一种使用相关子查询来构建嵌套对象的方法:

select json_arrayagg(
    json_object(
        'user', cu.name,
        'companies', (
            select json_arrayagg(
                json_object(
                    'name', c.name, 
                    'feedback', (
                        select json_arrayagg(
                            json_object(
                                'comment', f.comment, 
                                'feedback_id', f.id
                            )
                        )
                        from feedback f 
                        where f.company_id = c.id
                    )
                ) 
            )
            from company c
            where c.companyuser_id = cu.id
        )
    ) 
) res
from companyuser cu

这会生成一个单行结果集,其中包含一个名为

res
的列,其中包含 JSON 输出。

© www.soinside.com 2019 - 2024. All rights reserved.