Maison  >  Article  >  base de données  >  Comment obtenir tous les champs du groupe de données lorsque MySQL analyse le groupe de données JSON

Comment obtenir tous les champs du groupe de données lorsque MySQL analyse le groupe de données JSON

王林
王林avant
2023-05-29 20:01:461702parcourir

    Introduction

    Pendant le processus de développement, j'ai rencontré la chaîne du groupe de données json et j'ai dû analyser le groupe json pour obtenir toutes les informations du groupe. Le format suivant :

    [{"itemId":3101,"itemName":"空滤器及进气管道"},{"itemId":3102,"itemName":"水管、水泵"},{"itemId":3103,"itemName":"柴油管道"},{"itemId":3104,"itemName":"高压泵、机油泵"}]

    En observant le groupe json, nous avons constaté qu'il s'agit d'une liste contenant plusieurs chaînes json. Ce que nous devons faire est de diviser toutes les chaînes json de la liste et de comparer chaque json. string Faites l’analyse.

    Après analyse, il a été constaté que lorsque la chaîne JSON existe indépendamment, elle peut être extraite à l'aide de la méthode JSON_EXTRACT. Étant donné que la liste contient plusieurs chaînes JSON, nous devons la diviser en plusieurs chaînes JSON.

    Avant d'étudier le contenu de cet article, vous devez au préalable comprendre deux fonctions de MySQL :

    SUBSTRING_INDEX#🎜🎜 ##🎜🎜 #

    JSON_EXTRACT

    Étape 1 : Diviser une ligne en plusieurs lignes

    Diviser une ligne en plusieurs lignes, c'est-à-dire diviser la liste Divisée en plusieurs lignes de json, pour cela nous avons besoin de

    1.1 Créez un nouveau keyid de table et insérez uniquement des nombres commençant à 0, comme suit :

    #🎜🎜 #

    #🎜🎜 #

    Dans d'autres tutoriels, il est également possible d'utiliser le champ help_topic_id de la table mysql.help_topic. Cependant, cette table de bibliothèque nécessite des autorisations root avant de pouvoir être utilisée. Par conséquent, il est plus approprié de créer votre propre table de correspondance.

    Comment obtenir tous les champs du groupe de données lorsque MySQL analyse le groupe de données JSON

    Remarque : La valeur de id ne peut pas être inférieure au nombre de chaînes json dans la liste. Par exemple, s'il y a 4 chaînes JSON dans la liste ci-dessus, la valeur id doit être supérieure à 4. La valeur maximale de help_topic_id est 700. Si le nombre de chaînes json dans la liste est supérieur à cette valeur, il est inapproprié d'utiliser help_topic_id.

    1.2 Trouvez l'identifiant de division

    Le soi-disant identifiant de division est un signe qui peut être divisé en plusieurs lignes à la fois en fonction de ce symbole. Dans la liste ci-dessous, l'identifiant de fractionnement est introuvable, il doit donc être traité. Considérez ; comme un identifiant divisé. Le contenu traité est le suivant :
    {"itemId":3101,"itemName":"空滤器及进气管道"};{"itemId":3102,"itemName":"水管、水泵"};{"itemId":3103,"itemName":"柴油管道"};{"itemId":3104,"itemName":"高压泵、机油泵"}

    Supprimez les deux signes de liste [ et ] avant et après, et remplacez },{ par };{ afin que ; puisse être transformé en un identifiant fractionné. Comme suit

    select replace(replace(replace(jsonarr,"},{","};{"),"]",""),"[","") as jsonarr from maptest

    1.3 Diviser plusieurs lignes en rejoignant le

    Comment obtenir tous les champs du groupe de données lorsque MySQL analyse le groupe de données JSONÀ ce stade, nous pouvons utiliser l'opération JOIN pour fusionner la table maptest Connectez-vous à la table keyid nouvellement créée pour faire correspondre plusieurs lignes de données sous la condition ON. Divisé via SUBSTRING_INDEX.

    Le code est le suivant :

    select 
    a.jsonarr,
    SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.id + 1 ), ";",- 1 ) AS jsonarr_info,
    b.id
    from 
    (select replace(replace(replace(jsonarr,"},{","};{"),"]",""),"[","") as jsonarr from maptest) a
    join keyid b 
    on b.id< ( length( a.jsonarr ) - length( replace ( a.jsonarr, ";", "" ) ) + 1 )
    ;
    Comment obtenir tous les champs du groupe de données lorsque MySQL analyse le groupe de données JSON À ce stade, le travail de division du groupe json en plusieurs lignes est complété.

    Étape 2 : Analyser la chaîne json

    Après avoir été divisée en plusieurs lignes, elle peut être analysée via JSON_EXTRACT. L'effet est le suivant :

    Le code complété est le suivant :

    select 
    a.jsonarr,
    SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.id + 1 ), ";",- 1 ) AS jsonarr_info,
    b.id,
    JSON_EXTRACT(SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.id + 1 ), ";",- 1 ), '$[0].itemId') as itemId,
    replace(JSON_EXTRACT(SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.id + 1 ), ";",- 1 ), '$[0].itemName'),'"','') as itemName
    from 
    (select replace(replace(replace(jsonarr,"},{","};{"),"]",""),"[","") as jsonarr from maptest) a
    join keyid b 
    on b.id< ( length( a.jsonarr ) - length( replace ( a.jsonarr, ";", "" ) ) + 1 )
    ;
    Comment obtenir tous les champs du groupe de données lorsque MySQL analyse le groupe de données JSONBien sûr, il est également possible de transmettez le champ help_topic_id de la table mysql.help_topic. Le code et les résultats sont les suivants :

    select 
    a.jsonarr,
    SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.help_topic_id + 1 ), ";",- 1 ) AS jsonarr_info,
    b.help_topic_id,
    JSON_EXTRACT(SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.help_topic_id + 1 ), ";",- 1 ), '$[0].itemId') as itemId,
    replace(JSON_EXTRACT(SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.help_topic_id + 1 ), ";",- 1 ), '$[0].itemName'),'"','') as itemName
    from 
    (select replace(replace(replace(jsonarr,"},{","};{"),"]",""),"[","") as jsonarr from maptest) a
    join mysql.help_topic b 
    on b.help_topic_id < ( length( a.jsonarr ) - length( replace ( a.jsonarr, ";", "" ) ) + 1 )
    ;

    Remarque : Si le champ analysé par JSON_EXTRACT est une chaîne, il aura "" guillemets doubles, remplacez-les simplement par replace. Comment obtenir tous les champs du groupe de données lorsque MySQL analyse le groupe de données JSON

    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!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer