Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 将JSON数据带到单个select上_Mysql_Json - Fatal编程技术网

Mysql 将JSON数据带到单个select上

Mysql 将JSON数据带到单个select上,mysql,json,Mysql,Json,我有一个名为“menu”的表,其中有一列名为STRUCTURE。它是一个“文本类型”列,包含一个JSON,其菜单结构由另一个名为“category”的表的ID引用 例如:[{“id”:1},{“id”:3},{“id”:4},{“id”:131},{“id”:125},{“id”:5}] 上述ID是“类别”表中列出的类别。然而,回到我的网站,它已经非常沉重的执行,循环,在该循环中作出“选择*从类别,其中id=1,=2”,等等 我读到有一种称为JSON的新型列,它可以在查询时引用信息。如果我错了,

我有一个名为“menu”的表,其中有一列名为STRUCTURE。它是一个“文本类型”列,包含一个JSON,其菜单结构由另一个名为“category”的表的ID引用

例如:[{“id”:1},{“id”:3},{“id”:4},{“id”:131},{“id”:125},{“id”:5}]

上述ID是“类别”表中列出的类别。然而,回到我的网站,它已经非常沉重的执行,循环,在该循环中作出“选择*从类别,其中id=1,=2”,等等

我读到有一种称为JSON的新型列,它可以在查询时引用信息。如果我错了,请纠正我

是否可以对该表“menu”进行查询,并在单个查询中返回该JSON的每个ID的信息

我需要的示例(我不知道语法):

结果:

ID  |  Title       |  Structure              |  Data (Virtual infos, this column doesnt exists)
1   |  Menu Header | [{"id": 1}, {"id": 3}]  |  [{"1":{"id":1,"title":"Cat 01","active":"true"},"2":{"id":2,"title":"Cat 02","active":"true"}}] 

据我所知,这是不可能的。 您必须将
信息加入
JSON
-数组中。 因此MYSQL必须以某种方式处理/操作JSON。 (现在我很好奇,也许其他人可以发布一个关于这个的黑客帖子。)

我认为这不是个好主意:-)

也许我可以向你提出一个替代方案

选项1:MySQL左连接 在这个例子中,我使用ID,排序作为复合主键
主键(ID,排序)

然后,您就有了一个规范化的表,您可以从
类别
-表中获取所需的信息

SELECT `ID`, c.Title, c.Url, c. as menu FROM menus m
    LEFT JOIN categories c ON c.ID = m.CategoryID
    ORDER BY `Sorting`
现在,只需一个查询即可获得所需的所有信息:-)

选项2:异步构建表 您还可以使用自己选择的编程语言异步执行复杂查询

也许:

  • 一天一次
  • 当某人更新类别时
  • 当有人更新菜单时
  • 人工
使用复杂的查询来确定菜单是否异步执行并将其作为数组(在redis或其他任何形式中)并不重要;-)

关于建立菜单的更多信息(可能是有用的信息)
活动状态
状态 不要在数据库中存储
active
。 稍后在代码中检查状态

(这将提高缓存命中率)

多级导航 如果您需要(抱歉,我不知道您为什么要使用JSON,考虑一个
children
属性或其他东西):


这是一篇关于你的好文章。

你是个好人,谢谢你的回复。我试图避免使用第一种方法,因为该系统已投入生产多年,将产生大量工作。但我知道这也许真的是最好的主意。关于“active”列,它只是一个标志,用于知道哪些行已准备就绪,或者正在被中介。我将阅读这篇关于树模式结构的文章!您仍然可以使用选项2。使用当前结构并从中生成选项1(异步)。仅替换应用程序的查询部分。然后,您就有了所谓的数据“表示”。数据仍然以原始方式存储,您刚刚优化了查询端:-)
ID          | Sorting | CategoryID
-----------------------------------
menu_header | 1       | 7
menu_header | 2       | 6
menu_header | 3       | 8
SELECT `ID`, c.Title, c.Url, c. as menu FROM menus m
    LEFT JOIN categories c ON c.ID = m.CategoryID
    ORDER BY `Sorting`