MySQL使用nodeJs嵌套Json对象

Ray*_*nga 1 mysql sql arrays json group-by

我有两个 MySQL 表

category(id, name)
product(id, name, category_id)
Run Code Online (Sandbox Code Playgroud)

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"
      }
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

产品嵌套在相应类别的实体中。

我是一个新手,不知道如何使用 MySQL 中的 nodeJs 重现这个问题。请协助

GMB*_*GMB 6

在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
Run Code Online (Sandbox Code Playgroud)

如果您想将所有记录聚合在一个唯一的 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
Run Code Online (Sandbox Code Playgroud)