我已经成功完成了一些 MySQL JSON 文档存储式类型的查询,但现在我遇到了一个非常复杂的查询,超出了我的专业范围。任何帮助是极大的赞赏。
目标:从 MySQL 创建一个允许呈现此导航树的 json 提要:
制作步骤:
安装此 SQL 脚本: https ://implerus.com/st_overflow/profile.sql
然后安装这个 SQL 脚本: https ://implerus.com/st_overflow/oscal_rev5.sql
这将创建 2 个表:“profiles”和“oscal_rev5”,其中 json 数据被放置在每个表的“json_data”列中。
现在,如果您想快速查看哪些 json 数据被拉入到这些 json_data 列中,以下是数据:
https://www.implerus.com/st_overflow/profile_data.json
https://www.implerus.com/st_overflow/OSCAL_Rev5_Latest.json
所以,这是目标:
- 编写一个 mySQL JSON 查询,从配置文件 (json_data) 表中提取“控制 ID”。它应该返回“ac-1”、“ac-2”、“ac-3”、“ac-6.7”、“ac-6.9”、“ac-7”等。
我可以向您展示一个我认为应该有效的查询,但不能:
SELECT control.controlid FROM profiles, JSON_TABLE(json_data, '$.profile.imports.include."id-selectors[*]"' COLUMNS (controlid VARCHAR(10) PATH '$."control-id"')) control
我没有得到任何结果,我不知道为什么。我怀疑它与路径和带连字符的双引号有关,但从我读过的内容来看,这就是你应该如何支持带连字符的查询。
- 然后,以某种方式将这些条目与 oscal_rev5 json_data 左连接,以检索“ac-1”、“ac-2”、“ac-3”、“ac-6.7”等值的所有标题,并将数据作为 json 返回那(在本例中为 ReactJS)将能够将上面的导航树绘制为 Bootstrap Accordion。因此查询应返回导航的 1 级部分(“访问控制”、“意识和培训”、“审计和责任”等,以及源自上述第 1 步的“子”节点。
我确实有一个检索“父节点”列表的工作查询:
SELECT grouplist.id, grouplist.title FROM oscal_rev5, JSON_TABLE(json_data, '$.catalog.groups[*]' COLUMNS (id VARCHAR(140) PATH '$.id',class VARCHAR(20) PATH '$.class',title VARCHAR(80) PATH '$.title')) grouplist
我在返回子父控件列表时尝试失败:
SELECT grouplist.id, grouplist.title FROM oscal_rev5, JSON_TABLE(json_data, '$.catalog.groups.controls[*]' COLUMNS (id VARCHAR(140) PATH '$.id',class VARCHAR(20) PATH '$.class',title VARCHAR(80) PATH '$.title')) grouplist
什么都不返回,我不知道为什么。您会认为只需在路径中撞到一个节点就可以使用“$.catalog.groups.controls[*]”获取 id、class、title 数据,但它失败且没有错误。
请注意 OSCAL 数据中的“groups”->“controls”->“id”:“ac-1”的标题为“Policy and Procedures”。然后注意“groups”->“controls”->“id”:“ac-2”的标题是“Account Management”。并注意 "groups"->"controls"->"id": "ac-6.7" 的标题是 "Review of User Privileges"。对于导航树的第 2 级,这些都是返回的好数据。
并且由于所有这些“ac-1”、“ac-2”、“ac-6.7”等条目都以“ac”开头,那么它们都需要包裹在“父”“ac”节点下 - - -节点,根据同一个oscal json数据有一个标题叫做“访问控制”。同样,从第一步返回的所有以“at”开头的值都需要在结果中属于“Awareness and Training”父级。
- 然后,以某种方式 count() 导航树中属于“访问控制”、“意识和培训”、“审计和责任”等的所有子导航元素,并在 mySQL 结果中提供该数据。
所以,最大的问题是 - - - 有没有一种方法可以将所有 3 个步骤组合成一个 mySQL JSON 查询并返回一组区分父导航节点及其子节点的结果,以便以后可以输出为JSON 并用于驱动导航树 UI。