我有一个JSON
列manifest
,其中包含一系列对象。
我需要返回所有表行,其中数组中的任何对象都有一个slide_id
存在于子选择中。
JSON字段的结构是..
{ matrix:[
{
row:1,
col:1,
slide_id:1
},
{
row:1,
col:2,
slide_id:5
}
]
}
所以我想运行这样的东西......
SELECT id FROM presentation WHERE manifest->'$.matrix[*].slide_id' IN ( (SELECT id from slides WHERE date_deleted IS NOT NULL) );
但是这并不起作用,因为manifest->'$.matrix[*].slide_id'
为每一行返回一个JSON数组。
我设法让这个工作,但它扫描整个表格时速度惊人......
SELECT
p.id
FROM
(
SELECT id,
manifest->'$.matrix[*].slide_id' as slide_ids
FROM `presentation`
) p
INNER JOIN `pp_slides` s
ON JSON_CONTAINS(p.slide_ids, CAST(s.id as json), '$')
WHERE s.date_deleted IS NOT NULL
如果我将其过滤到单独的演示文稿ID,那么它也不会太糟糕,但对于包含几百张幻灯片的演示文稿仍然需要700毫秒。有更清洁的方法吗?
我想最好的方法是重构它以将矩阵存储为关系表....