假设我有三张桌子
主表
+----+------+---------------------+
| 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"
},
]
}
]
}
]
表之间存在一对多关系,因此您需要聚合它们 - 也就是说,基本上使用
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 输出。