Apabila bekerja dengan data JSON dalam MySQL, mencari objek berdasarkan nilai kunci tertentu boleh menjadi mencabar. Ini kerana kaedah tradisional memerlukan pengetahuan tentang indeks tatasusunan atau teknik pengekstrakan kompleks.
JSON_TABLE() to the Rescue
Nasib baik, MySQL 8.0 memperkenalkan fungsi JSON_TABLE() , yang memudahkan proses ini. Pertimbangkan skema berikut:
CREATE TABLE `fields` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `label` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL, `options` json DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Dengan data dimasukkan sebagai:
INSERT INTO `fields` (label, options) VALUES ( 'My Field', '[{"text": "Grass", "value": "1"}, {"text": "Synthetic (New Type - Soft)", "value": "2"}, {"text": "Synthetic (Old Type - Hard)", "value": "3"}, {"text": "Gravel", "value": "5"}, {"text": "Clay", "value": "6"}, {"text": "Sand", "value": "7"}, {"text": "Grass/Synthetic Mix", "value": "8"}]' );
Untuk mencari rentetan "Rumput" dengan memberikan kunci "1", anda boleh menggunakan pertanyaan berikut :
select field_options.* from fields cross join json_table(fields.options, '$[*]' columns( text text path '$.text', value text path '$.value' ) ) as field_options where field_options.value = 1;
Pertanyaan ini akan mengembalikan objek yang diingini:
+-------+-------+ | text | value | +-------+-------+ | Grass | 1 | +-------+-------+
Alternatif: Struktur Jadual Tradisional
Sementara JSON_TABLE() menyediakan penyelesaian, ia boleh menyusahkan untuk digunakan berulang kali. Pendekatan alternatif ialah menyimpan data dalam struktur jadual tradisional dengan lajur yang berasingan untuk teks dan nilai, seperti berikut:
CREATE TABLE field_options ( id int(10) unsigned NOT NULL AUTO_INCREMENT, text varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL, value varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Dengan data dimasukkan sebagai:
INSERT INTO field_options (text, value) VALUES ('Grass', '1'), ('Synthetic (New Type - Soft)', '2'), ('Synthetic (Old Type - Hard)', '3'), ('Gravel', '5'), ('Clay', '6'), ('Sand', '7'), ('Grass/Synthetic Mix', '8');
Menggunakan struktur ini, carian menjadi lebih mudah:
SELECT * FROM field_options WHERE value = '1';
Pendekatan ini menghilangkan keperluan untuk pertanyaan JSON yang kompleks, menjadikan pengambilan data lebih mudah.
Atas ialah kandungan terperinci Bagaimana untuk Cekap Mendapatkan Objek JSON dalam MySQL Berdasarkan Nilai Utama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!