Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2524 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MySQL] Extraction de champs Json

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[MySQL] Extraction de champs Json

n°2337541
Furaxx
Posté le 02-08-2019 à 15:23:01  profilanswer
 

Bonjour,
 
J'ai dans une table un champs de type Json formaté comme ceci:
 

Code :
  1. {"Intitule":{"name":"Intitule","stats":false,"is_array":false,"is_filter":true,"chart":"pie","col":"6"},"Fin":{"name":"Date de fin","stats":false,"is_array":false,"is_filter":false,"chart":"pie","col":"6"}


 
Ma question est: quelle requête dois-je faire pour "extraire" les noms des clés (ici représenté "Intitule" et "Fin" ), le "name" de chacune, pour celle qui ont comme valeur "is_filters=true".
 
Je tourne en rond depuis quelque temps sans parvenir à trouver une solution…
Par avance merci! :)

mood
Publicité
Posté le 02-08-2019 à 15:23:01  profilanswer
 

n°2337543
mechkurt
Posté le 02-08-2019 à 15:40:34  profilanswer
 

Pas évident, le JSON n'étant pas un format ou l'ordre des clef/valeur est prédictible, tu ne peux même pas faire un LIKE ('%Intitule%"is_filter":true%') sur une colonne en FULLTEXT, ni même une REGEX (qui serait de toute façon catastrophique en terme de perf)...
 
Regardes du coté de https://dev.mysql.com/doc/refman/5. [...] on-extract si tu peux trouver ton bonheur.


---------------
D3
n°2337628
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 06-08-2019 à 14:33:52  profilanswer
 

Après, est-ce une bonne idée de stocker du json en base si on veut en extraire des données ? Pourquoi ne pas avoir créé une table dédiée avec les colonnes "name", "stats", "is_array", ... et éventuellement une colonne "cle" prenant la valeur "Intitule" et "Fin" et ne pas l'avoir remplie avec les données de ce JSON ?

Message cité 1 fois
Message édité par Harkonnen le 06-08-2019 à 14:36:03

---------------
J'ai un string dans l'array (Paris Hilton)
n°2337630
Erlum
Posté le 06-08-2019 à 15:34:56  profilanswer
 

Harkonnen a écrit :

Après, est-ce une bonne idée de stocker du json en base si on veut en extraire des données ? Pourquoi ne pas avoir créé une table dédiée avec les colonnes "name", "stats", "is_array", ... et éventuellement une colonne "cle" prenant la valeur "Intitule" et "Fin" et ne pas l'avoir remplie avec les données de ce JSON ?


 
Ça peut être utile quand t'es face à des données dont la forme n'est pas forcément prévisible, ou que ces données augmenteraient significativement la complexité de ta base en utilisant l'approche traditionnelle.
 
Y'a pas mal de cas d'utilisations pour ça.

n°2337631
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 06-08-2019 à 15:42:06  profilanswer
 

:jap:
 
Reste à savoir si c'est le cas pour Furaxx


---------------
J'ai un string dans l'array (Paris Hilton)
n°2337979
pierrot_77
Posté le 17-08-2019 à 08:46:24  profilanswer
 

à coeur vaillant, rien d'impossible  ;)  
 
stoker du json n'est certes pas très ingénieux, mais c'est fait :D
 

Code :
  1. select
  2.         @pos1 := locate('{', fields,position('{' in fields)+1) as pos1,
  3.         @pos2 := locate('}',fields) as pos2,
  4.         @pos3 := locate('{',fields, @pos2+1) as pos3,
  5.         @pos4 := locate('}',fields, @pos3+1) as pos4,
  6.         substr(fields,@pos1,@pos2) as   intitule,
  7.         substr(fields,@pos3,@pos4) as   fin
  8. from planningbe.test_json
  9. having intitule like '%"stats":true%';


 
Voilà comment extraire de "intituler" tous les "stats":true ;)
 
la table comprend près de 200 000 enreg, pour en extraire les plus 32 000 il faut 1.4 sec, question perfs, c'est pas si dramatique ce ça :D :D
 
 
@pluche
 
Pierre


Message édité par pierrot_77 le 17-08-2019 à 08:48:44
n°2338088
Furaxx
Posté le 21-08-2019 à 14:58:26  profilanswer
 

Bonjour,
 
Désolé pour mon absence, vacances, tout ça… :)
 
Pour répondre à une question posée, je suis en effet dans le cas où le nombre de champs ainsi que certains noms peuvent être amener à changer d'un enregistrement à l'autre. Créer un champs pour chacun ne serait donc pas pratique du tout.
J'étais au départ parti sur cette solution, et je me suis rabattu sur le JSon ensuite au vue des soucis que ça posait.
 
Le truc Pierrot_77 c'est que avec ta requête on part du principe qu'on connait déjà les noms de clés (ici "intitule" et "fin" ), mais ce ne sera pas forcément le cas, vu que ces clés en question peuvent changer d'un enregistrement à l'autre (j'ai un cas où il n'y a pas "fin" par exemple).
 
J'ai posé la question sur Stackoverflow et une personne m'a répondu avec une requête qui fonctionne (je devrai attendre de revenir au boulot pour retrouver la page en question), c'est une requête à rallonge qui fonctionne, mais qui montre bien comme vous le dites que stocker sous forme JSon n'est pas vraiment une bonne solution… Suf que là je ne voyais pas trop comment faire autrement.
 
Je mettrai à jour ce message dès que j'aurai récupéré la requête en question.
 
En tout cas merci! :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MySQL] Extraction de champs Json

 

Sujets relatifs
[MySQL] Champs Json, ordre non gardé[MySQL] - Sélection d'un relevé du mois précédent
[résolu] Tester si un evariable est bien une connexion Mysql ?[MySQL] - Sélectionner enregistrements qui ne sont pas ailleurs
[MySQL] Nombre de cours et exercices avec une seules requête[MySQL] temps fetching trop important
Python 3.6 extraction de feuille excel pour convertion en PDF[JAVASCRIPT] JSON.parse()
Plus de sujets relatifs à : [MySQL] Extraction de champs Json


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR