2

如果我有两个带有 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)值中进行选择,例如:

树木 = 橡树、李子树

长度 = 10m、15m、20m

年龄 = 10 岁

我怎么能做这个?提前致谢。

4

1 回答 1

4

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

你可以让它像这样工作:

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

然而,这只是一个你不应该在任何生产系统中使用的技巧,我建议不要在测试系统中使用它。相反,重构您的数据库,这样就永远不会有任何您要在查询中匹配的JSON 。可以将辅助数据存储为 JSON,只需确保在插入之前提取 ID 和名称,然后在数据库表中的单独列中插入,以便数据库引擎可以发挥其关系魔法。

于 2013-05-21T00:09:21.643 回答