Vergleichen Sie die WHERE-Bedingung von MySQL mit dem JSON_TABLE-Wert
P粉011684326
P粉011684326 2024-03-27 11:34:54
0
1
409

Ich habe eine Liste von IDs als durch Kommas getrennte Liste von JSON-Werten erhalten. Einige Beispieldatensätze lauten wie folgt [340596,340597,340595] Diese Liste kann riesig sein, manchmal 50.000 IDs, getrennt durch Kommas

Die folgende Abfrage verbindet diese IDs mit dem Tabellenprimärschlüssel und ruft die Datensätze ab, die derzeit in der Tabelle vorhanden sind

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

Die Haupttabelle enthält möglicherweise diese IDs, oder diese Datensätze wurden möglicherweise aus der Haupttabelle gelöscht. Der Zweck dieser Abfrage besteht also darin, sicherzustellen, dass die zurückgegebene Ergebnismenge nur aktive Datensätze enthält.

Ich musste einen weiteren Filter auf diese Abfrage anwenden und sie basierte auf einem anderen JSON-Int-Array und musste mit der ContactID-Spalte abgeglichen werden

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  
)

Allerdings ist die Leistung von MySQL IN bei großen Ergebnismengen nicht besser. Können wir dieses IN durch etwas Besseres ersetzen?

P粉011684326
P粉011684326

Antworte allen(1)
P粉251903163

您可以将 IN 子句中的 id 转储到临时表中,然后将它们与 JSON_TABLE 连接以获得结果。 或者,您可以使用 CTE 并加入其中。

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;
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage