sql >> Database teknologi >  >> RDS >> Mysql

Hvordan genererer jeg indlejrede json-objekter ved hjælp af mysql native json-funktioner?

Grunden til at du får disse fejl er, at det overordnede json-objekt ikke forventer et resultatsæt som et af dets input, du skal have simple objektpar som {navn, streng} osv. fejlrapport – muligvis tilgængelig i fremtidige funktioner ... dette betyder blot, at du skal konvertere dine resultater med flere rækker til en sammenkædning af resultater adskilt af kommaer og derefter konverteret til et json-array.

Du havde det næsten med dit andet eksempel.

Du kan opnå det, du leder efter, med GROUP_CONCAT-funktionen

select json_object(
  'id',p.id 
 ,'desc',p.`desc`
 ,'child_objects',json_array(
                     (select GROUP_CONCAT(
                                 json_object('id',id,'parent_id',parent_id,'desc',`desc`)
                             )   
                      from child_table 
                      where parent_id = p.id))
                   )
 from parent_table p;

Dette virker næsten, det ender med at behandle underforespørgslen som en streng, der efterlader escape-tegnene derinde.

'{\"id\": 1, 
\"desc\": \"parent row 1\", 
\"child_objects\": 
    [\"
    {\\\"id\\\": 1,
     \\\"desc\\\": \\\"child row 1\\\", 
    \\\"parent_id\\\": 1
    },
    {\\\"id\\\": 2, 
    \\\"desc\\\": \\\"child row 2\\\", 
    \\\"parent_id\\\": 1}\"
    ]
}'

For at få dette til at fungere i et passende format, skal du ændre den måde, du opretter JSON-outputtet på som følger:

select json_object(
  'id',p.id 
 ,'desc',p.`desc`
 ,'child_objects',(select CAST(CONCAT('[',
                GROUP_CONCAT(
                  JSON_OBJECT(
                    'id',id,'parent_id',parent_id,'desc',`desc`)),
                ']')
         AS JSON) from child_table where parent_id = p.id)

 ) from parent_table p;

Dette vil give dig det nøjagtige resultat, du har brug for:

'{\"id\": 1, 
\"desc\": \"parent row 1\", 
\"child_objects\": 
    [{\"id\": 1, 
    \"desc\": \"child row 1\", 
    \"parent_id\": 1
    }, 
    {\"id\": 2, 
    \"desc\": \"child row 2\", 
    \"parent_id\": 1
    }]  
}'


  1. Sammenligning af Windows Azure VM-ydeevne, del 2

  2. Sådan grupperer du en rapport i Access 2016

  3. Sådan fungerer Extract() i PostgreSQL

  4. Hvordan migrerer man en PostgreSQL-database til en SQLServer-database?