sql >> Database teknologi >  >> RDS >> Mysql

MySQL One-to-Many til JSON-format

Her er en SQL-forespørgsel, der muligvis opfylder dit krav. Den bruger MySQL JSON_ARRAYAGG() aggregeret funktion at generere en række JSON-objekter (som er oprettet ved hjælp af JSON_OBJECT() ).

Et mellemniveau af gruppering udføres i joinforbindelsen for at generere sales JSON-array for hver bruger. Derefter aggregeres resultaterne i en enkelt linje med én kolonne, der indeholder den resulterende JSON-array af objekter.

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

Demo på DB Fiddle

Hvis du ombryder returværdien med JSON_PRETTY , outputtet er som følger :

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

Rediger :her er en (grim) løsning til MySQL <5.7, hvor JSON-understøttelse ikke er tilgængelig. Den er kun afhængig af strengmanipulationsfunktioner. Bemærk venligst, at dette kun vil virke, så længe varchar-felterne ikke indeholder " tegn :

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

Demo på DB Fiddle




  1. konverter Unix-epoketidsstempler til JavaScript-datotidsstempler

  2. Tildeling af xml genereret af en while-løkke til en variabel

  3. SIGN() Funktion i Oracle

  4. FIND_IN_SET med flere værdier