在 MySQL 中處理 JSON 資料時,根據特定鍵值來尋找物件可能具有挑戰性。這是因為傳統方法需要了解陣列索引或複雜的擷取技術。
JSON_TABLE() 來救援
幸運的是,MySQL 8.0 引入了 JSON_TABLE() 函數,這簡化了這個過程。考慮以下架構:
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;
資料插入為:
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"}]' );
要透過提供鍵“1”來搜尋字串“Grass”,您可以使用以下查詢:
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;
此查詢將傳回所需的物件:
+-------+-------+ | text | value | +-------+-------+ | Grass | 1 | +-------+-------+
替代:傳統表格結構
雖然JSON_TABLE() 提供了解決方案,重複使用會很麻煩。另一種方法是將資料儲存在傳統的表格結構中,其中文字和值具有單獨的列,如下所示:
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;
將資料插入為:
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');
使用此結構,搜尋變得更簡單:
SELECT * FROM field_options WHERE value = '1';
這種方法消除了複雜的JSON 查詢的需要,使資料檢索更加簡單。
以上是如何根據鍵值高效檢索MySQL中的JSON物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!