Comparez la condition WHERE de Mysql en utilisant la valeur JSON_TABLE
P粉011684326
P粉011684326 2024-03-27 11:34:54
0
1
399

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粉011684326
P粉011684326

répondre à tous(1)
P粉251903163

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;
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal