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;
我得到了一个 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;