Maison > base de données > tutoriel mysql > le corps du texte

Comment récupérer efficacement des objets JSON dans MySQL en fonction des valeurs clés ?

Mary-Kate Olsen
Libérer: 2024-11-02 01:54:02
original
166 Les gens l'ont consulté

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

Recherche d'objets basés sur des valeurs clés dans MySQL JSON

Lorsque vous travaillez avec des données JSON dans MySQL, localiser un objet basé sur une valeur clé spécifique peut être difficile. En effet, les méthodes traditionnelles nécessitent une connaissance de l'index du tableau ou des techniques d'extraction complexes.

JSON_TABLE() à la rescousse

Heureusement, MySQL 8.0 a introduit la fonction JSON_TABLE() , ce qui simplifie ce processus. Considérons le schéma suivant :

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;
Copier après la connexion

Avec les données insérées comme :

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"}]'
);
Copier après la connexion

Pour rechercher la chaîne "Grass" en fournissant la clé "1", vous pouvez utiliser la requête suivante :

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;
Copier après la connexion

Cette requête renverra l'objet souhaité :

+-------+-------+
| text  | value |
+-------+-------+
| Grass | 1     |
+-------+-------+
Copier après la connexion

Alternative : structure de table traditionnelle

Alors que JSON_TABLE() fournit un solution, il peut être fastidieux de l’utiliser à plusieurs reprises. Une approche alternative consiste à stocker les données dans une structure de table traditionnelle avec des colonnes séparées pour le texte et la valeur, comme suit :

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;
Copier après la connexion

Avec les données insérées comme :

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');
Copier après la connexion

En utilisant cette structure, la recherche devient plus simple :

SELECT * FROM field_options WHERE value = '1';
Copier après la connexion

Cette approche supprime le besoin de requêtes JSON complexes, ce qui rend la récupération des données plus simple.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!