从连接的MySQL表中选择已解码的JSON数据

时间:2012-08-24 06:38:11

标签: mysql json select

如果我有两个带有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岁

我怎么能这样做? 提前谢谢。

1 个答案:

答案 0 :(得分:4)

简而言之,这是不可能的。构建关系数据库是为了快速比较它们可以索引的常量值。 JSON只是MySQL的一个字符串,任何类型的部分字符串匹配都会触发所谓的表扫描,当你获得大量数据时,它本质上会变得非常慢。

COULD 让它像这样工作:

SELECT * FROM Trees
JOIN SelectedTrees
  ON properties LIKE CONCAT('"id":"', Trees.id, '"')

然而,这只是绝不应该在任何生产系统中使用的黑客攻击,我建议不要在测试系统中使用它。而是重构您的数据库,因此中的任何JSON都不会在您的查询中匹配。将辅助数据存储为JSON很好,只需确保在插入之前提取ID和名称,然后在数据库表的不同列中插入,以便数据库引擎可以发挥其关系魔力。