如果我有两个带有JSON数据的表,你能不能写信给我如何从MySQL数据库中进行选择?其中一个有以下结构:
Table Trees
(id, name, value) - three columns
包括以下数据
1, trees, [{"name":"Oaktree","value":1,"target":null},{"name":"Appletree","value":2,"target":null},{"name":"Plumtree","value":3,"target":null}]
2, length, [{"name":"10m","value":1,"target":null},{"name":"15m","value":2,"target":null},{"name":"20m","value":3,"target":null}]
3, age, [{"name":"5y","value":1,"target":null},{"name":"10y","value":2,"target":null},{"name":"20y","value":3,"target":null}]
第二个表格具有以下结构:
Table SelectedTrees
(properties) - only one column
包括以下数据
[{"id":"1","value":["1","3"]},{"id":"2","value":["1", "2", "3"]},{"id":"3","value":["2"]}]
它表示从Trees表中选择的数据。来自 selectedTrees 的属性列中的 id 与 Trees 表中的 id 列对应。我想从数据库中选择真实(json_decoded)值,如:
Trees = Oaktree,Plumtree
长度= 10米,15米,20米
年龄= 10岁
我怎么能这样做? 提前谢谢。
扬
答案 0 :(得分:4)
简而言之,这是不可能的。构建关系数据库是为了快速比较它们可以索引的常量值。 JSON只是MySQL的一个字符串,任何类型的部分字符串匹配都会触发所谓的表扫描,当你获得大量数据时,它本质上会变得非常慢。
你 COULD 让它像这样工作:
SELECT * FROM Trees
JOIN SelectedTrees
ON properties LIKE CONCAT('"id":"', Trees.id, '"')
然而,这只是绝不应该在任何生产系统中使用的黑客攻击,我建议不要在测试系统中使用它。而是重构您的数据库,因此中的任何JSON都不会在您的查询中匹配。将辅助数据存储为JSON很好,只需确保在插入之前提取ID和名称,然后在数据库表的不同列中插入,以便数据库引擎可以发挥其关系魔力。