sql >> Database >  >> RDS >> Mysql

Hoe genereer ik geneste json-objecten met behulp van mysql native json-functies?

De reden dat u deze fouten krijgt, is dat het bovenliggende json-object geen resultatenset verwacht als een van zijn invoer, u moet eenvoudige objectparen hebben zoals {name, string} enz. bugrapport - mogelijk beschikbaar in toekomstige functionaliteit ... dit betekent alleen dat u uw resultaten met meerdere rijen moet converteren naar een aaneenschakeling van resultaten, gescheiden door komma's en vervolgens omgezet in een json-array.

Je had het bijna gehad met je tweede voorbeeld.

U kunt bereiken wat u zoekt met de GROUP_CONCAT-functie

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;

Dit werkt bijna, het behandelt de subquery uiteindelijk als een string die de escape-tekens daarin laat.

'{\"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}\"
    ]
}'

Om dit in een geschikt formaat te laten werken, moet u de manier waarop u de JSON-uitvoer maakt als volgt wijzigen:

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;

Dit geeft u het exacte resultaat dat u nodig heeft:

'{\"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. Een database maken in SQL Server

  2. SQL Bulkimport vanuit CSV

  3. Azure Database for MySQL Server maken en implementeren met behulp van Azure Portal en Workbench

  4. Hoe de Date()-functie werkt in SQLite