Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak generować zagnieżdżone obiekty json przy użyciu natywnych funkcji json mysql?

Powodem, dla którego otrzymujesz te błędy, jest to, że nadrzędny obiekt json nie oczekuje zestawu wyników jako jednego z jego danych wejściowych, musisz mieć proste pary obiektów, takie jak {nazwa, ciąg} itp. raport o błędzie - może być dostępny w przyszłej funkcjonalności ... oznacza to po prostu, że musisz przekonwertować wyniki z wielu wierszy na konkatynację wyników oddzielonych przecinkami, a następnie przekonwertować je na tablicę json.

Prawie miałeś to z drugim przykładem.

Możesz osiągnąć to, czego szukasz dzięki funkcji GROUP_CONCAT

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;

To prawie działa, kończy się traktowaniem podzapytania jako łańcucha, który pozostawia tam znaki ucieczki.

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

Aby to działało w odpowiednim formacie, musisz zmienić sposób tworzenia danych wyjściowych JSON w następujący sposób:

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;

To da ci dokładny wynik, którego potrzebujesz:

'{\"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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. użyj zmiennej dla nazwy tabeli w mysql sproc

  2. Zmiana strefy czasowej MySQL?

  3. Unikanie dzikich kart MySQL

  4. Częste pytania i odpowiedzi dotyczące wywiadu MySQL dla nowszych i doświadczonych

  5. Czy Hibernate może współpracować ze składnią ON DUPLICATE KEY UPDATE w MySQL?