Lý do bạn nhận được những lỗi này là đối tượng json mẹ không mong đợi một tập hợp kết quả làm một trong các đầu vào của nó, bạn cần có các cặp đối tượng đơn giản như {name, string} vv báo cáo lỗi - có thể có sẵn trong chức năng trong tương lai ... điều này chỉ có nghĩa là bạn cần chuyển đổi các kết quả nhiều hàng của mình thành một tập hợp các kết quả được phân tách bằng dấu phẩy và sau đó chuyển đổi thành một mảng json.
Bạn gần như đã có nó với ví dụ thứ hai của mình.
Bạn có thể đạt được những gì hiện tại với hàm 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;
Điều này gần như hoạt động, nó kết thúc việc coi truy vấn con như một chuỗi để lại các ký tự thoát ở đó.
'{\"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}\"
]
}'
Để làm cho điều này hoạt động ở định dạng thích hợp, bạn cần thay đổi cách tạo đầu ra JSON như sau:
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;
Điều này sẽ cung cấp cho bạn kết quả chính xác mà bạn yêu cầu:
'{\"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
}]
}'