首頁  >  文章  >  資料庫  >  如何根據鍵值高效檢索MySQL中的JSON物件?

如何根據鍵值高效檢索MySQL中的JSON物件?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-02 01:54:02243瀏覽

How to Efficiently Retrieve JSON Objects in MySQL Based on Key Values?

根據 MySQL JSON 中的鍵值尋找物件

在 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn