La raison pour laquelle vous obtenez ces erreurs est que l'objet json parent n'attend pas un ensemble de résultats comme l'une de ses entrées, vous devez avoir des paires d'objets simples comme {name, string} etc rapport de bogue - peut être disponible dans une future fonctionnalité ... cela signifie simplement que vous devez convertir vos résultats multi-lignes en une concaténation de résultats séparés par des virgules, puis convertis en un tableau json.
Vous l'avez presque eu avec votre deuxième exemple.
Vous pouvez obtenir ce que vous recherchez avec la fonction 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;
Cela fonctionne presque, cela finit par traiter la sous-requête comme une chaîne qui laisse les caractères d'échappement dedans.
'{\"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}\"
]
}'
Pour que cela fonctionne dans un format approprié, vous devez modifier la façon dont vous créez la sortie JSON comme suit :
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;
Cela vous donnera le résultat exact dont vous avez besoin :
'{\"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
}]
}'