sql >> Databáze >  >> RDS >> Mysql

MySQL One-to-Many do formátu JSON

Zde je dotaz SQL, který by mohl splňovat vaše požadavky. Používá Agregační funkce MySQL JSON_ARRAYAGG() ke generování pole objektů JSON (které jsou vytvořeny pomocí JSON_OBJECT() ).

V rámci spojení se provádí střední úroveň seskupování, aby se generovaly sales Pole JSON každého uživatele. Poté jsou výsledky agregovány do jednoho řádku s jedním sloupcem, který obsahuje výsledné pole objektů 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

Ukázka na DB Fiddle

Pokud vrácenou hodnotu zabalíte do JSON_PRETTY , výstup je následující:

[
  {
    "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"
      }
    ]
  }
]

Upravit :zde je (ošklivé) řešení pro MySQL <5.7, kde podpora JSON není k dispozici. Spoléhá se pouze na funkce pro manipulaci s řetězci. Upozorňujeme, že to bude fungovat pouze tehdy, pokud pole varchar nebudou obsahovat " znak :

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

Ukázka na DB Fiddle




  1. C# -- Získávání dat z MySQL a jejich řazení do stránek bez DataGridView

  2. Je možné odkazovat na jeden sloupec jako na více cizích klíčů?

  3. neúspěšné provedení příkazu s php a mysql

  4. Základy tabulkových výrazů, 1. část