これらのエラーが発生する理由は、親jsonオブジェクトが入力の1つとして結果セットを期待していないためです。{name、string}などの単純なオブジェクトペアが必要ですバグレポート-将来の機能で利用可能になる可能性があります ...これは、複数行の結果をコンマで区切られた結果の連結に変換してから、json配列に変換する必要があることを意味します。
2番目の例でほぼ完了しました。
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;
これはほぼ機能し、サブクエリを文字列として扱い、エスケープ文字をそこに残します。
'{\"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}\"
]
}'
これを適切な形式で機能させるには、JSON出力の作成方法を次のように変更する必要があります。
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;
これにより、必要な正確な結果が得られます:
'{\"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
}]
}'