Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL One-to-Many ke format JSON

Berikut adalah kueri SQL yang mungkin memenuhi kebutuhan Anda. Ini menggunakan Fungsi agregat MySQL JSON_ARRAYAGG() untuk menghasilkan larik objek JSON (yang dibuat menggunakan JSON_OBJECT() ).

Pengelompokan tingkat menengah dilakukan dalam gabungan, untuk menghasilkan sales Array JSON dari setiap pengguna. Kemudian hasilnya digabungkan menjadi satu baris, dengan satu kolom yang berisi array objek JSON yang dihasilkan.

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 di DB Fiddle

Jika Anda membungkus nilai yang dikembalikan dengan JSON_PRETTY , outputnya adalah sebagai berikut :

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

Sunting :ini adalah solusi (jelek) untuk MySQL <5.7, di mana dukungan JSON tidak tersedia. Itu hanya bergantung pada fungsi manipulasi string. Harap dicatat bahwa ini hanya akan berfungsi selama bidang varchar tidak mengandung " karakter :

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 di 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. MySQL - nilai default untuk TIMESTAMP(3)

  2. Menyebarkan Database Relasional MySQL di Ubuntu 12.04 (Trenggiling Tepat)

  3. Cetak data di ResultSet beserta nama kolomnya

  4. Bagaimana cara menyimpan leaflet.draw titik poligon yang sudah selesai ke tabel mysql

  5. Mengambil id yang terakhir dimasukkan untuk beberapa baris