Mysql
 sql >> Base de données >  >> RDS >> Mysql

Format MySQL un à plusieurs vers JSON

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

Démo sur DB Fiddle

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

Démo sur DB Fiddle