Mysql 将JSON数据带到单个select上
我有一个名为“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的信息 我需要的示例(我不知道语法): 结果: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的新型列,它可以在查询时引用信息。如果我错了,
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`