1
votes

Requête MySql avec Json

Je suis tombé sur quelques jours que je ne peux pas résoudre. Je connais le MySql de base mais j'essayais de travailler avec SELECTs pour récupérer des données en JSON.

J'ai une table dans la base de données appelée home_slider.

À l'intérieur, j'ai les colonnes suivantes:

+------------+----------------+-----------------+-------------------------------+
|   shop_id  |    id_lang     |   id_image | json_groups_id                     |
+------------+----------------+-----------------+--------------------------------+
|       1    |        1       |      2     | {"2": "Guest", "3": "Customer"}     |
|       1    |        1       |      3     | {"1": "Visit", "4": "Other"}        |
|       1    |        1       |      4     | {"2": "Guest", "5": "Test"}
+-------------+----------------+-----------------+--------------------------------+

Ce sont tous des champs INT sauf json_groups_id où j'insère des fichiers via json_econde.

Le JSON dans le champ "json_groups_id" est structuré comme ceci:

XXX

Toutes ces données sont enregistrées sous une forme simple.

Au final je me trouve différent sont similaires à ceci:

{"2": "Guest", "3": "Customer", "4": "Custom"}


6 commentaires

Juste une vérification rapide ... Quelle version de MySQL utilisez-vous s'il vous plaît


Afficher votre requête et la version MySql


TBH Je ne suis pas très satisfait de l'approche de filtrage des données directement sur une colonne qui contient un champ "données brutes" / objet comme JSON. Tout comme une idée naïve, ne serait-il pas plus logique de décrire ce type d'association dans une table séparée afin que vous puissiez l'interroger simplement par ID?


dans la version locale 5.6.35


Je n'ai encore vu aucune question sur Stack Overflow concernant le stockage de JSON dans MySQL, où l'utilisation de JSON était une bonne idée. Il est préférable de stocker les données de manière normalisée.


Avec MySQL 5.6, vous ne pouvez pas utiliser les fonctions JSON. Jetez un œil à ma réponse ici: stackoverflow.com/questions/37816269/... - ces fonctions peuvent être utiles pour vous aussi.


3 Réponses :


2
votes

Vous devez normaliser votre base de données, en l’ayant au moins dans la troisième forme normale. Ainsi, les données atomiques se trouveraient dans un champ séparé. Ensuite, vous pouvez facilement sélectionner les données, en utilisant la condition WHERE , mais comme béquille, vous pouvez utiliser LIKE pour la structure actuelle.

SELECT * FROM `table` WHERE `json_groups_id` LIKE '{"YOURNUMBER1"%' OR `json_groups_id` LIKE '{"YOURNUMBER2"%' OR `json_groups_id` LIKE '{"YOURNUMBER3"%'

Vous pouvez également essayer JSON_CONTAINS () https://dev.mysql.com/doc/ refman / 8.0 / fr / json-search-functions.html

Mais ce n'est pas une bonne pratique, à mon humble avis


1 commentaires

Je pense aussi que ce serait la voie à suivre. Séparez les données dans une autre table afin de pouvoir les interroger facilement sans avoir à appliquer des filtres assez lents sur une colonne. 1: relation N. Cela faciliterait également l'extension à l'avenir.



0
votes

Sur la base des informations que vous avez fournies, je suppose que vous avez besoin de la relation M: N pour décrire votre relation entre les données JSON et le tableau d'origine que vous avez décrit dans votre message.

Votre tableau d'origine (mis à jour)

+-------------+-------------------+
| FK group_id | FK Original Table |
+-------------+-------------------+
|       1     |          A        |
|       1     |          B        |
|       2     |          C        |
|       4     |          D        |
|       5     |          E        |
+-------------+-------------------+

Nouvelle table

+-------------+----------------+
|   group_id  |    desc/name   |
+-------------+----------------+
|       1     |    Visit       |
|       2     |    Guest       |
|       3     |    Customer    |
|       4     |    Other       |
|       5     |    Test        |
+-------------+----------------+

Relation / Table de jointure:

+------------+----------------+------------+
|   shop_id  |    id_lang     |   id_image |
+------------+----------------+------------+
|       1    |        1       |      2     |
|       1    |        1       |      3     |
|       1    |        1       |      4     | 
+------------+----------------+------------+

De toute évidence, vous avez dans ce cas, soit stocker le JSON en tant que duplicata, soit ce qui serait encore mieux et c'est aussi ce que je recommanderais => de le reconstruire à partir des données que vous récupérez de la base de données.

L'exemple de tableau ci-dessus est juste comme un indice comment cela pourrait être réalisé au niveau DB. Si vous n'avez pas besoin d'une reconstruction des données, je ne me soucierais même pas du tout du JSON d'origine. Je ne sais pas quelle est la clé primaire de votre table d'origine, j'ai donc ajouté une clé générique pour la table de jointure.

Mise à jour: supprimé 1: N car M: N est nécessaire.


4 commentaires

ok donc j'ai semblé comprendre que l'approche est mauvaise. J'essaye de créer deux tableaux et de les relier entre eux. Fondamentalement, ce que je veux obtenir, ce sont toutes les id_image qui appartiennent à un ou plusieurs id_groups que j'ai dans un tableau. Maintenant j'essaye de relier les tableaux voyons ce qui se passe


@Mariogasparella Si le même identifiant de groupe se rapporte à différentes lignes, vous avez besoin de M: N et de la deuxième approche. Cependant, je vais maintenant mettre à jour ma réponse car vous avez besoin de M: N d'après ce que je comprends. Parce que vous avez le même identifiant de groupe sur plusieurs lignes.


@Mariogasparella réaliser cela sans JSON dans une colonne est beaucoup plus facile et plus sophistiqué. Je sais que cela pourrait être plus de travail en premier lieu, mais c'est la voie à suivre. En outre, il est beaucoup plus facile d'étendre si vous avez besoin de plus d'informations ajoutées à votre groupe.


merci les gars, j'ai dû prendre en compte aussi les directives et les décisions commerciales .. à l'époque j'utilisais JSON_EXTRACT mais je réécris le code pour créer une table relationnelle. Merci beaucoup pour le conseil



0
votes

Vous pouvez certainement le faire en utilisant la fonction JSON_EXTRACT () dans mysql. Cela peut être dû au fait que vous faites une erreur ou une autre. Laissez-moi vous l'expliquer à l'aide d'un exemple:

prenons une table qui contient JSON (table client_services ici):

+-----+-----------+----------------------+
| id  | client_id | quota | data_transfer|
+-----+-----------+----------------------+
| 100 |      1000 |     1 |       160000 |
| 101 |      1000 |     2 |       800000 |
| 102 |      1000 |     3 |        70000 |
| 103 |      1001 |     1 |        97000 |
| 104 |      1001 |     2 |         1760 |
| 105 |      1002 |     2 |         1060 |
+-----+-----------+----------------------+

Pour sélectionner chaque JSON champs, exécutez cette requête:

SELECT 
    id, client_id, 
    json_extract(service_values, '$.quota') AS quota,
    json_extract(service_values, '$.data_transfer') AS data_transfer
FROM client_services;

Le résultat sera donc:

+-----+-----------+--------------------------------------+
| id  | client_id | service_values                       |
+-----+-----------+------------+-------------------------+
| 100 |      1000 | { "quota": 1,"data_transfer":160000} |
| 101 |      1000 | { "quota": 2,"data_transfer":800000} |
| 102 |      1000 | { "quota": 3,"data_transfer":70000}  |
| 103 |      1001 | { "quota": 1,"data_transfer":97000}  |
| 104 |      1001 | { "quota": 2,"data_transfer":1760}   |
| 105 |      1002 | { "quota": 2,"data_transfer":1060}   |
+-----+-----------+--------------------------------------+

Je sais que vous l'avez essayé en utilisant json_extract (), mais il se peut que vous ayez fait une petite erreur. Examinez attentivement cet exemple, je suis sûr que cela fonctionnera.


0 commentaires