Berikut adalah kueri SQL yang mungkin memenuhi kebutuhan Anda. Ini menggunakan Fungsi agregat MySQL JSON_ARRAYAGG()
untuk menghasilkan larik objek JSON (yang dibuat menggunakan JSON_OBJECT()
).
Pengelompokan tingkat menengah dilakukan dalam gabungan, untuk menghasilkan sales
Array JSON dari setiap pengguna. Kemudian hasilnya digabungkan menjadi satu baris, dengan satu kolom yang berisi array objek JSON yang dihasilkan.
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
Jika Anda membungkus nilai yang dikembalikan dengan JSON_PRETTY
, outputnya adalah sebagai berikut :
[
{
"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"
}
]
}
]
Sunting :ini adalah solusi (jelek) untuk MySQL <5.7, di mana dukungan JSON tidak tersedia. Itu hanya bergantung pada fungsi manipulasi string. Harap dicatat bahwa ini hanya akan berfungsi selama bidang varchar tidak mengandung "
karakter :
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