【问题标题】:MySQL Convert JSON column to array and get pagesMySQL将JSON列转换为数组并获取页面
【发布时间】:2021-08-29 09:26:46
【问题描述】:

标题很难选,对不起!

我拥有的数据库结构是以下几列:

页面

  • id (int)
  • 网址(字符串)
  • 内容(字符串)
  • created_at(时间戳)

  • id (int)
  • related_pa​​ge_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']);
}

我希望你通过这个丑陋的例子理解我的目标。

【问题讨论】:

  • 请提供样本数据。这也可能是为什么存储分隔数据是一个糟糕的选择。这将是一个使用pages_to_group 表的简单任务。
  • 出于好奇,您为什么决定对related_pa​​ge_ids 使用JSON,而不是标准的规范化解决方案,它应该是多对多关系的第三个表?

标签: mysql many-to-many mysql-json


【解决方案1】:

如果您有权访问 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)才能正常工作。

【讨论】:

    猜你喜欢
    • 2011-11-21
    • 2014-01-23
    • 2023-03-28
    • 2013-01-11
    • 2017-02-14
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多