Mysql WHERE 条件针对 JSON_TABLE 值

Mysql WHERE condition against a JSON_TABLE value

我得到了一个 ID 列表,作为 JSON 值的逗号分隔列表,一些示例数据集如下所示 [340596,340597,340595] 这个列表可能很大,有时有 50k 个用逗号分隔的 ID

以下查询将这些 ID 连接到 table 主键并获取当前存在于 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  

mastertable 可能包含这些 ID,或者这些记录可能已从 mastertable 中删除所以此查询的目的是确保 return 结果集仅包含活跃记录

我必须针对此查询再应用一个过滤,过滤基于另一个 JSON int 数组,需要将其与列 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  
)

然而,Mysql IN 的性能对于大型结果集来说并不好。我们可以用其他更好的方式替换这个 IN 吗?

您可以将 IN 子句中的 ID 转储到临时 table 中,然后将它们与 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;