Ето SQL заявка, която може да отговаря на вашите изисквания. Тя използва Агрегирана функция на MySQL JSON_ARRAYAGG()
за генериране на масив от JSON обекти (които се създават с помощта на JSON_OBJECT()
).
В рамките на обединението се извършва междинно ниво на групиране, за генериране на sales
JSON масив на всеки потребител. След това резултатите се обединяват в един ред с една колона, която съдържа получения 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
Ако обвиете връщаната стойност с JSON_PRETTY
, изходът е както следва:
[
{
"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"
}
]
}
]
Редактиране :ето (грозно) решение за MySQL <5.7, където поддръжката на JSON не е налична. Той разчита само на функции за манипулиране на низове. Моля, имайте предвид, че това ще работи само докато полетата на varchar не съдържат "
знак :
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