Voici une requête SQL qui pourrait répondre à vos besoins. Elle utilise Fonction d'agrégation MySQL JSON_ARRAYAGG()
pour générer un tableau d'objets JSON (qui sont créés en utilisant JSON_OBJECT()
).
Un niveau intermédiaire de regroupement est effectué au sein de la jointure, pour générer les sales
Tableau JSON de chaque utilisateur. Ensuite, les résultats sont agrégés sur une seule ligne, avec une colonne contenant le tableau d'objets JSON résultant.
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
Si vous enveloppez la valeur de retour avec JSON_PRETTY
, le résultat est le suivant :
[
{
"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"
}
]
}
]
Modifier :voici une solution (laide) pour MySQL <5.7, où le support JSON n'est pas disponible. Il s'appuie uniquement sur les fonctions de manipulation de chaînes. Veuillez noter que cela ne fonctionnera que tant que les champs varchar ne contiennent pas le "
caractère :
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