Comment faire pour récupérer les valeurs stockées dans le tableau JSON dans la requête MySQL lui-même?
J'ai le tableau suivant
product_id product_name image_path misc
---------- -------------- ------------ ------
1 flex http://firstpl... {"course_level_id":19,"group_id":"40067"}
2 Android http://firstpl... {"course_level_id":20,"group_id":"40072"}
Alors, comment puis-je récupérer l'produit_nom,image_path & only "group_id" valeur comme "40067" à partir de "divers" de la colonne.
J'ai essayé ci-dessous requête, mais il retour 1/0 dans Divers colonne.
SELECT product_name,image_path,misc REGEXP '(.*\"group_id\":*)' as Misc FROM ref_products where product_id=1
Aucune idée de comment les gars pour le faire ?
Vous ne devriez pas avoir stocké en json en premier lieu, puis.
Pas de copain c'est un moyen facile de le faire au lieu de l'ajout de plusieurs colonnes stocker dans une colonne. Si aucune solution à ce alors bienvenue
c'est très simple: mettre les données, alors vous ne pouvez pas l'obtenir à nouveau. Vous devez avoir enregistré les données dans des colonnes distinctes.
j'ai posté un échantillon de données ici. Ce n'est pas possible de changer d'ajouter les colonnes & migrer les données. J'ai donc besoin désespérément une solution à cette question.
Non, @zerkms n'est pas désagréable, il est correct. Si vous souhaitez requête a de la valeur, de le stocker dans une colonne. Sinon, pourquoi ne pas simplement avoir un seul énorme colonne de type varchar dans chaque table avec tout ce qu'il contient?
Pas de copain c'est un moyen facile de le faire au lieu de l'ajout de plusieurs colonnes stocker dans une colonne. Si aucune solution à ce alors bienvenue
c'est très simple: mettre les données, alors vous ne pouvez pas l'obtenir à nouveau. Vous devez avoir enregistré les données dans des colonnes distinctes.
j'ai posté un échantillon de données ici. Ce n'est pas possible de changer d'ajouter les colonnes & migrer les données. J'ai donc besoin désespérément une solution à cette question.
Non, @zerkms n'est pas désagréable, il est correct. Si vous souhaitez requête a de la valeur, de le stocker dans une colonne. Sinon, pourquoi ne pas simplement avoir un seul énorme colonne de type varchar dans chaque table avec tout ce qu'il contient?
OriginalL'auteur UI Dev | 2014-02-06
Vous devez vous connecter pour publier un commentaire.
La
REGEXP
fonction retourne 0 ou 1. Vous devrez utiliser d'autres fonctions de chaîne.Essayez ceci:
substr(misc,locate('group_id',misc)+11,5) as Misc
. Mais cela suppose que group_id toujours 5 caractères.Donc c'est mieux:
substring_index(substr(misc,locate('group_id',misc)+char_length('group_id')+3),'"',1) as Misc
.Ici est un violon pour montrer de travail: http://sqlfiddle.com/#!2/ea02e/15
MODIFIER vous pouvez Vous débarrasser de la
+3
nombre magique en incluant les guillemets doubles et deux points dans les cordes, comme ceci:substring_index(substr(misc,locate('"group_id":"',misc)+char_length('"group_id":"')),'"',1) as Misc
Je crois qu'il devrait être noté que c'est très étrange. Soit c'est les données que vous avez dans votre base de données et vous devez jouer avec elle dans le code (pas dans la base de données). Sinon vous pouvez même aller aussi loin que
JOIN
sur cette valeur. Si vous avez vraiment besoin de cette pièce spécifique de votre point de données dans SQL alors vous devriez vraiment l'enregistrer en tant que l'un, au lieu de JSON-en colonne de chose.je n'ai pas votre point de vue. Est-il vraiment mauvais pour enregistrer les données au format JSON.
Oui. Voir @zerkms et mon commentaire sur la question. Vous pouvez faire ce que vous faites. Vous pouvez le faire fonctionner. Mais c'est la mauvaise façon d'utiliser une base de données.
Eh bien, il ya une raison que vous utilisez une base de données relationnelle. Si vous avez besoin du format JSON (par exemple dans une situation où vous souhaitez enregistrer ce exact JSON que vous avez envoyé à un utilisateur), il POURRAIT être utile, mais pas dans ce cas, comme vous le démontrer par le désir d'obtenir l'une des valeurs de l'json dans une requête. Ce n'est pas la façon dont il devrait être, et l'un des problèmes, vous pouvez obtenir est exactement celui que vous êtes maintenant face: vous voulez quelque chose, mais avoir un moment difficile de l'obtenir. Maintenant, si vous ne pouvez pas changer quoi que ce soit, puis il suffit de le faire dans le code, pas dans la base de données. Il devrait être plus facile (parser json par exemple)
OriginalL'auteur Turophile
Depuis que cette question a été posée de MySQL ont introduit la prise en charge pour le type de données JSON.
Dans MySQL 5.7.8 (et plus), vous pouvez interroger le réel JSON chaîne stockée dans la colonne à l'aide de
JSON_EXTRACT()
ou l'équivalent->
alias.Par exemple:
Voir: https://dev.mysql.com/doc/refman/5.7/en/json.html
OriginalL'auteur Moob
Vous pouvez utiliser un common_schema cadre de MySQL (compatible avec tous les MySQL >= 5.1) et ensuite obtenir ce dont vous avez besoin sur cette voie:
common_schema cadre: https://code.google.com/p/common-schema/
OriginalL'auteur Pepe