一个遍历树节点的巧妙设计,同事看了赞不绝口

写在前面

疫情期间,没法正常复工,而做为程序员的咱们能够远程办公,此时工做效率就变得格外重要,由于家里没人监督,用巧妙的方法实现了需求,剩下的时间就能够学习(摸鱼)了=。=mysql

故事背景

表和数据结构以下程序员

表现如图sql

特色:典型的树形结构,层级数不肯定(子节点依旧能够添加子节点,能够无限衍生)数据结构

需求

查询一个节点的全部子节点post

例如:咱们查询“四川”这个节点,须要获得的结果为(“成都”,“小吃街1”,“小吃街2”,“广安”)4个结果集mysql索引

猜测

遇到这个需求之后,最容易想到的办法大概有这么两个:学习

  • 业务代码实现递归查询,直到查到的结果集都为子节点为止,将全部查询的结果放在集合里放回。(层级关系多了后,执行效率不敢看)
  • 写存储过程解决(百度到的方式,怎么实现我本身也没看明白..)

这两种方式不管是时间复杂度仍是业务实现难度都不是我这种懒人可以接受的。。cdn

一个大胆的想法

既然查询的是全部的子节点,那么从根节点结果集的子节点路径必定是有一段是相等的。blog

  • 能不能拓展一个字段,记录从根节点到该节点的路径

如图所示:咱们在新增的时候记录一下路径递归

path = 父path + pid (精华所在,细细品味)

接下来就很容易了:查询四川的全部子节点:

  • 根节点到达四川的路径a为(1-32)
  • select * from table where path like "1-32%" 一句话搞定

查询的like前缀还能匹配索引,你说美不美。

什么,你不理解为何能匹配索引?
这里安利一下个人另外一篇文章

若是对你的思路有启发,点个赞再走吧~

相关文章
相关标签/搜索