Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL One-to-Many do formatu JSON

Oto zapytanie SQL, które może spełnić Twoje wymagania. Używa Funkcja agregująca MySQL JSON_ARRAYAGG() do wygenerowania tablicy obiektów JSON (które są tworzone przy użyciu JSON_OBJECT() ).

Pośredni poziom grupowania jest wykonywany w ramach złączenia, aby wygenerować sales Tablica JSON każdego użytkownika. Następnie wyniki są agregowane w jednym wierszu, z jedną kolumną zawierającą wynikową tablicę obiektów 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

Demo na DB Fiddle

Jeśli zawiniesz zwracaną wartość z JSON_PRETTY , dane wyjściowe są następujące :

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

Edytuj :tutaj jest (brzydkie) rozwiązanie dla MySQL <5.7, gdzie obsługa JSON nie jest dostępna. Opiera się tylko na funkcjach manipulacji ciągami. Należy pamiętać, że będzie to działać tylko tak długo, jak pola varchar nie zawierają " 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

Demo na DB Fiddle




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd MySQL 1005?

  2. Jak zduplikować bazę danych za pomocą phpMyAdmin

  3. DOŁĄCZENIE do MySQL czy UŻYWANIE?

  4. MySQL JAK IN()?

  5. Wampserver 2.1 wyświetla pomarańczową ikonę po instalacji w systemie Windows 7