Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Menjana Objek JSON Bersarang daripada Data Hubungan MySQL Menggunakan JSON_OBJECT dan JSON_ARRAY?

Bagaimana untuk Menjana Objek JSON Bersarang daripada Data Hubungan MySQL Menggunakan JSON_OBJECT dan JSON_ARRAY?

Linda Hamilton
Lepaskan: 2024-11-29 06:41:10
asal
578 orang telah melayarinya

How to Generate Nested JSON Objects from MySQL Relational Data Using JSON_OBJECT and JSON_ARRAY?

Menjana Objek JSON Bersarang dengan Fungsi JSON Asli MySQL

MySQL versi 5.7.12 memperkenalkan fungsi JSON asli, membolehkan penciptaan dokumen JSON terus daripada data hubungan. Untuk mencapai matlamat ini, seseorang boleh memanfaatkan fungsi JSON_OBJECT() dan JSON_ARRAY().

Pertimbangkan contoh jadual yang disediakan:

CREATE TABLE `parent_table` (
   `id` int(11) NOT NULL,
   `desc` varchar(20) NOT NULL,
   PRIMARY KEY (`id`)
);
CREATE TABLE `child_table` (
   `id` int(11) NOT NULL,
   `parent_id` int(11) NOT NULL,
   `desc` varchar(20) NOT NULL,
   PRIMARY KEY (`id`,`parent_id`)
);
Salin selepas log masuk

Matlamatnya adalah untuk menjana dokumen JSON dengan objek bersarang, menyerupai yang berikut:

[{
    "id" : 1,
    "desc" : "parent row 1",
    "child_objects" : [{
            "id" : 1,
            "parent_id" : 1,
            "desc" : "child row 1"
        }, {
            "id" : 2,
            "parent_id" : 1,
            "desc" : "child row 2"
        }
    ]
}]
Salin selepas log masuk

Menyelesaikan Ralat

Percubaan sebelumnya telah menemui ralat "Subquery mengembalikan lebih daripada 1 baris" kerana objek JSON memerlukan pasangan nilai kunci mudah sebagai input. Subkueri yang mengembalikan berbilang baris perlu ditukar kepada rentetan tunggal atau tatasusunan JSON.

Penyelesaian

Untuk mengatasi ralat ini, fungsi GROUP_CONCAT() MySQL boleh digunakan. Pertanyaan berikut menyelesaikannya:

select json_object(
  'id',p.id 
 ,'desc',p.`desc`
 ,'child_objects',json_array(
                     (select GROUP_CONCAT(
                                 json_object('id',id,'parent_id',parent_id,'desc',`desc`)
                             )   
                      from child_table 
                      where parent_id = p.id))
                   )
 from parent_table p;
Salin selepas log masuk

Untuk menghapuskan aksara melarikan diri dalam output, pertanyaan diubah suai untuk menggunakan fungsi CAST() dan CONCAT():

select json_object(
  'id',p.id 
 ,'desc',p.`desc`
 ,'child_objects',(select CAST(CONCAT('[',
                GROUP_CONCAT(
                  JSON_OBJECT(
                    'id',id,'parent_id',parent_id,'desc',`desc`)),
                ']')
         AS JSON) from child_table where parent_id = p.id)

 ) from parent_table p;
Salin selepas log masuk

Pertanyaan yang diperhalusi ini menghasilkan output JSON yang dikehendaki:

'{\"id\": 1, 
\"desc\": \"parent row 1\", 
\"child_objects\": 
    [{\"id\": 1, 
    \"desc\": \"child row 1\", 
    \"parent_id\": 1
    }, 
    {\"id\": 2, 
    \"desc\": \"child row 2\", 
    \"parent_id\": 1
    }]  
}'
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Menjana Objek JSON Bersarang daripada Data Hubungan MySQL Menggunakan JSON_OBJECT dan JSON_ARRAY?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan