Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie generiere ich verschachtelte JSON-Objekte mit mysql-nativen JSON-Funktionen?

Der Grund, warum Sie diese Fehler erhalten, ist, dass das übergeordnete json-Objekt keine Ergebnismenge als eine seiner Eingaben erwartet, Sie müssen einfache Objektpaare wie {name, string} usw. Fehlerbericht - möglicherweise in zukünftigen Funktionen verfügbar ... dies bedeutet nur, dass Sie Ihre mehrzeiligen Ergebnisse in eine Verkettung von Ergebnissen konvertieren müssen, die durch Kommas getrennt und dann in ein JSON-Array konvertiert werden.

Mit deinem zweiten Beispiel hättest du es fast geschafft.

Mit der GROUP_CONCAT-Funktion

können Sie erreichen, wonach Sie suchen
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;

Dies funktioniert fast, es endet damit, dass die Unterabfrage als Zeichenfolge behandelt wird, die die Escape-Zeichen dort belässt.

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

Damit dies in einem geeigneten Format funktioniert, müssen Sie die Art und Weise ändern, wie Sie die JSON-Ausgabe wie folgt erstellen:

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;

Dadurch erhalten Sie genau das gewünschte Ergebnis:

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