前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mysql用链式存储结构存一组数据,如何用最少查询得到完整链条?

Mysql用链式存储结构存一组数据,如何用最少查询得到完整链条?

作者头像
用户1289394
发布2023-08-22 16:17:20
3550
发布2023-08-22 16:17:20
举报
文章被收录于专栏:Java学习网Java学习网

Mysql 中使用链式存储结构保存一组数据,通常是通过在表中建立父子关系来实现的。比如,在表中保存每个节点的 id 和 parent_id, parent_id 表示该节点的父节点 id. 当我们需要查询某个节点的完整链条时,可以通过递归方式查询所有父节点直到跟节点为止。

下面是一个具体的实现过程:

  1. 首先,找到目标节点的 parent_id 值,假设为 target_parent_id。
  2. 创建一个空数组将最终结果存放在其中。
  3. 使用 while 循环进行递归查询,直到根节点为止。每次执行循环体前检查 target_parent_id 是否为 0,如果是,说明已经到达链条顶端,停止循环。
  4. 循环中执行以下操作:
  • 根据 target_parent_id 查询其父节点的 information.
  • 将该节点信息添加到结果数组中。
  • 将 target_parent_id 修改为当前节点的 parent_id.
  1. 最后返回结果数组,即为目标节点所在链条的完整链路。

以下是代码示例:

代码语言:javascript
复制
sql复制代码CREATE TABLE node(
    id INT PRIMARY KEY NOT NULL,
    name VARCHAR(50) NOT NULL,
    parent_id INT,
    -- 约束外键
    CONSTRAINT fk_node_parent_id FOREIGN KEY (parent_id)
        REFERENCES node(id)
);

-- 递归查询指定 id 的节点及其所有父节点
WITH RECURSIVE cte AS (
    SELECT id, name, parent_id 
    FROM node 
    WHERE id = target_id
    
    UNION ALL
    
    SELECT p.id, p.name, p.parent_id
    FROM node AS p
    JOIN cte ON cte.parent_id = p.id
)
SELECT * FROM cte;

以上代码中,通过 WITH RECURSIVE 语法可以循环查询出目标节点的所有父节点信息,并最终返回完整的链条。其中 target_id 可以根据实际情况替换成需要查询链条的起始节点 id。

这样就能最少查询得到完整的链条了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习网 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档