mysql - MySQL 使用 nodeJs 嵌套 Json 对象
问题描述
我有两个 MySQL 表
category(id, name)
product(id, name, category_id)
product(category_id)
是一个外键category(id)
,关系是一对多对一的关系,所以一个类别可以有许多产品。
我试图从数据库中获取它并以 JSON 格式为多个类别返回它,所以它看起来像这样:
[
{
"id": 1,
"name": "Category 1",
"products": [
{
"id": 1,
"name": "Chicken"
},
{
"id": 2,
"name": "Beef"
}
]
},
{
"id": 2,
"name": "Category 2",
"products": [
{
"id": 3,
"item": "Fries"
},
{
"id": 4,
"item": "Burgers"
}
]
}
]
产品嵌套在其相应类别的实体中的位置。
我是一个新手,不知道如何使用 MySQL 中的 nodeJs 来重现它。请协助
解决方案
在 MySQL 中,您可以使用json 生成器函数json_object()
和json 聚合函数json_arrayagg()
。
以下查询为每个类别生成一个记录,每个记录包含一个 json 对象:
select
json_object(
'id', c.id,
'name', c.name,
'products', json_arrayagg(
json_object(
'id', p.id,
'name', p.name
)
)
) cat
from category c
inner join product p on p.category_id = c.id
group by c.id, c.name
如果要将所有记录聚合到一个唯一的 json 数组中,则可以添加另一个聚合级别:
select json_arrayagg(cat)
from (
select
json_object(
'id', c.id,
'name', c.name,
'products', json_arrayagg(
json_object(
'id', p.id,
'name', p.name
)
)
) cat
from category c
inner join product p on p.category_id = c.id
group by c.id, c.name
) t
推荐阅读
- azure-devops - Azure DevOps 扩展需求
- google-bigquery - 如何从 BIg Query SQL 中的字符串中提取其中一个值
- python - 如何在python中动态地将数据放入字节数组并进行调制?
- java - 错误的请求响应,Jersey 1.17,@FormDataParam 和 Weblogic 12.1.2.0.0
- azure - Azure 云外壳不切换订阅
- python - 为什么我的 Python Tkinter Stone、Paper、Scissor 应用程序中的按钮工作不规律?
- python - 用符号理解 Leaky ReLU 导数
- ssl - NextJS Auth0:当“NODE_ENV”为生产环境且部署的环境不安全时,未设置状态或会话 cookie
- java - 将 Java 构造函数注释为实现 @FunctionalInterface
- ag-grid - 如何按 ASC 顺序对 AGGRID 列管理选项卡进行排序