Đây là một truy vấn SQL có thể đáp ứng yêu cầu của bạn. Nó sử dụng Hàm tổng hợp MySQL JSON_ARRAYAGG ()
để tạo một mảng các đối tượng JSON (được tạo bằng cách sử dụng JSON_OBJECT()
).
Cấp độ nhóm trung gian được thực hiện trong tham gia, để tạo ra sales
Mảng JSON của mỗi người dùng. Sau đó, kết quả được tổng hợp thành một dòng, với một cột chứa mảng đối tượng JSON.
SELECT
JSON_ARRAYAGG(JSON_OBJECT('id', u.id, 'name', u.name, 'sales', s.sales))
FROM
user u
LEFT JOIN (
SELECT
user,
JSON_ARRAYAGG(JSON_OBJECT('id', id, 'item', item)) sales
FROM sale
GROUP BY user
) s ON s.user = u.id
Nếu bạn bọc giá trị trả về bằng JSON_PRETTY
, kết quả như sau:
[
{
"id": 1,
"name": "User 1",
"sales": [
{
"id": 1,
"item": "t-shirt"
},
{
"id": 2,
"item": "jeans"
}
]
},
{
"id": 2,
"name": "User 2",
"sales": [
{
"id": 3,
"item": "sweatpants"
},
{
"id": 4,
"item": "gloves"
}
]
}
]
Chỉnh sửa :đây là một giải pháp (xấu) cho MySQL <5,7, không hỗ trợ JSON. Nó chỉ dựa vào các hàm thao tác chuỗi. Xin lưu ý rằng điều này sẽ chỉ hoạt động miễn là các trường varchar không chứa "
nhân vật:
SELECT
CONCAT(
'[',
GROUP_CONCAT( CONCAT( '{ "id":', u.id, ', "name":"', u.name, '", "sales":', s.sales, ' }' ) SEPARATOR ', ' ),
']'
)
FROM
user u
LEFT JOIN (
SELECT
user,
CONCAT(
'[',
GROUP_CONCAT( CONCAT( '{ "id":', id, ', "item":"', item, '" }' ) SEPARATOR ', '),
']'
) sales
FROM sale
GROUP BY user ) s ON s.user = u.id