带有group by的MySQL json_object和json_arrayagg未按预期工作

a14dhokn  于 2023-03-07  发布在  Mysql
关注(0)|答案(1)|浏览(189)

我与此表有多对多关系
表资产:
| 身份证|姓名|其他领域|
| - ------|- ------|- ------|
| 十九|资产1|...|
| 二十个|资产2|...|
| ...|...|...|
分支表:
| 身份证|姓名|其他领域|
| - ------|- ------|- ------|
| 1个|分支1|...|
| 第二章|分支2|...|
| ...|...|...|
分支机构资产:
| 分支标识|资产标识|
| - ------|- ------|
| 1个|1个|
| 1个|第二章|
| 第二章|十四|
| 数量|数量|
我想返回一个json对象,格式如下:

{
  'branches' : [
    {
      'branch_id': 1,
      'branch_name': 'branch 1',
      'branch_children': [
        {
          'asset_id': 1,
          'asset_name': 'asset 1'
        },
        {
          'asset_id': 2,
          'asset_name': 'asset 2'
        },
        {
          'asset_id': 99999,
          'asset_name': 'asset 99999'
        }
      ]
    },
    {
      'branch_id': 2,
      'branch_name': 'branch 2',
      'branch_children': [
        {
          'asset_id': 1,
          'asset_name': 'asset 1'
        },
        {
          'asset_id': 2,
          'asset_name': 'asset 2'
        },
        {
          'asset_id': 99999,
          'asset_name': 'asset 99999'
        }
      ]
    }
  ]
}

子元素可以是数组或对象,在这个例子中是模糊的。
使用此脚本:

select json_object(
  'branch_id', branches.id,
  'branch_name', branches.name,
  'branch_children', json_arrayagg(json_object('asset_id', list.asset_id, 'asset_name', list.asset_name))
)
from branches
left join (
  select b.id as branch_id, a.id as asset_id, a.name as asset_name
  from branch_r_asset ba
  join branches b
    on b.id = ba.branch_id
  join assets a
    on a.id = ba.asset_id
  group by b.id
) list on list.branch_id = branches.id
group by branches.id;

我得到了结果,但是在表中的每个branch_id都是按行分隔的,如下所示:

{"branch_name": "branch 1", "branch_id": "1", "branch_children": [{"asset_name": "asset 1", "asset_id": "1" }, {"asset_name": "asset 2", "asset_id": "2" }]}

{"branch_name": "branch 2", "branch_id": "2", "branch_children": [{"asset_name": "asset 15", "asset_id": "15" }, {"asset_name": "asset 244", "asset_id": "244" }, {"asset_name": "asset 7", "asset_id": "7" }]}

{"branch_name": "branch 3", "branch_id": "3", "branch_children": [{"asset_name": "asset 12", "asset_id": "12" }}]}

我不确定这是json管理问题(由我)还是一个组函数。
先谢了。

eufgjt7s

eufgjt7s1#

select json_object(
  'branches', json_arrayagg(
    json_object(
      'branch_id', branch_id,
      'branch_name', branch_name,
      'branch_children', branch_children)
    )
  )
)
from (
  select b.id as branch_id, b.name as branch_name, 
    json_arrayagg(
      json_object(
        'asset_id', a.id, 
        'asset_name', a.name
      )
    ) as branch_children
  from branches b
  left join branch_r_asset ba
    on b.id = ba.branch_id
  left join assets a
    on a.id = ba.asset_id
  group by b.id
) as t

相关问题