mysql - MySQL将JSON列转换为数组并获取页面
问题描述
选书名太难了,见谅!
我拥有的数据库结构是以下列:
页面
- 标识(整数)
- 网址(字符串)
- 内容(字符串)
- created_at(时间戳)
团体
- 标识(整数)
- related_page_ids (json)
- domain_id (int)
- created_at(时间戳)
我想要实现的是通过选定的域 ID 检索所有组,然后用它检索所有相关页面。如果我应该用丑陋的 PHP 和 MySQL 编写它:
$groups = SELECT * FROM groups WHERE domain_id = 1;
foreach($groups as $group){
$pages = SELECT * FROM pages WHERE IN id = implode($group['related_page_ids']);
}
我希望你能通过这个丑陋的例子来理解我的目标。
解决方案
如果您有权访问JSON_TABLE
(MySQL 8 / MariaDB 10.6),则可以在单个查询中完成:
SELECT * FROM pages
WHERE id IN (
SELECT * FROM JSON_TABLE(
(SELECT JSON_ARRAYAGG(related_page_ids) FROM groups WHERE domain_id=1),
'$[*][*]' columns(rel_id INTEGER path '$')) AS jt );
该列实际上需要是类型JSON
(不是 varchar)才能正常工作。
推荐阅读
- html - 如果高度太大,如何限制将显示多少图像?
- android - 使用谷歌地图指向特定位置
- python-3.x - Pandas:取具有匹配值的行的平均值
- javascript - 如何发布 Ajax 请求
- sql - Hibernate DDL 更新 SQL 查询
- math - R 编程语言有这种语法吗?
- javascript - 如何使用代码点火器 fromework 在 PHP 中打印出模态内部的内容
- angular - 如何避免使用 Visual Studio 2017 在 Angular 4 的生产模式下加载 node_modules 和 .ts 文件
- json - Cloudformation,模板验证错误:无效的模板属性或属性
- android - 用于 fastboot 和 adb 的 Windows 10 原始 USB 访问