recherche

Maison  >  Questions et réponses  >  le corps du texte

Comparez la condition WHERE de Mysql en utilisant la valeur JSON_TABLE

J'ai obtenu une liste d'identifiants sous forme de liste de valeurs JSON séparées par des virgules, quelques exemples d'ensembles de données sont les suivants [340596,340597,340595] Cette liste peut être énorme, parfois 50 000 identifiants, séparés par des virgules

La requête suivante connecte ces identifiants à la clé primaire de la table et obtient les enregistrements qui existent actuellement dans la table

SELECT s.id,s.contactid, s.Quantity FROM 
JSON_TABLE('[340596,340597,340595]', '$[*]' columns (Id int path '$')) AS sm   
LEFT JOIN mastertable s ON s.Id = sm.id

La table principale peut contenir ces identifiants, ou ces enregistrements peuvent avoir été supprimés de la table principale, le but de cette requête est donc de garantir que l'ensemble de résultats renvoyé ne contient que des enregistrements actifs

J'ai dû appliquer un filtre supplémentaire à cette requête et il était basé sur un autre tableau int JSON et je devais le faire correspondre avec la colonne ContactID

SELECT s.id,s.contactid, s.Quantity FROM 
JSON_TABLE('[340596,340597,340595]', '$[*]' columns (Id int path '$')) AS sm   
LEFT JOIN mastertable s ON s.Id = sm.id  
WHERE s.ContactId IN (
SELECT cm.id  FROM 
JSON_TABLE('[12345,450597,640595]', '$[*]' columns (Id int path '$')) AS cm  
)

Cependant, les performances de Mysql IN ne sont pas meilleures pour les grands ensembles de résultats. Pouvons-nous remplacer cet IN par quelque chose de mieux ?

P粉011684326P粉011684326244 Il y a quelques jours397

répondre à tous(1)je répondrai

  • P粉251903163

    P粉2519031632024-03-28 10:05:11

    Vous pouvez transférer les identifiants de la clause IN dans une table temporaire, puis les joindre avec JSON_TABLE pour obtenir le résultat. Alternativement, vous pouvez utiliser CTE et vous amuser.

    with temp as (
    SELECT cm.id  FROM 
    JSON_TABLE('[12345,450597,640595]', '$[*]' columns (Id int path '$')) AS cm  
    )
    SELECT s.id,s.contactid, s.Quantity FROM 
    JSON_TABLE('[340596,340597,340595]', '$[*]' columns (Id int path '$')) AS sm   
    LEFT JOIN mastertable s ON s.Id = sm.id
    INNER JOIN temp t ON s.ID = t.id;

    répondre
    0
  • Annulerrépondre