一個遍歷樹節點的巧妙設計,同事看了讚不絕口

寫在前面

疫情期間,沒法正常復工,而做爲程序員的咱們能夠遠程辦公,此時工做效率就變得格外重要,由於家裏沒人監督,用巧妙的方法實現了需求,剩下的時間就能夠學習(摸魚)了=。=mysql

故事背景

表和數據結構以下程序員

表現如圖sql

特色:典型的樹形結構,層級數不肯定(子節點依舊能夠添加子節點,能夠無限衍生)數據結構

需求

查詢一個節點的全部子節點post

例如:咱們查詢「四川」這個節點,須要獲得的結果爲(「成都」,「小吃街1」,「小吃街2」,「廣安」)4個結果集mysql索引

猜測

遇到這個需求之後,最容易想到的辦法大概有這麼兩個:學習

  • 業務代碼實現遞歸查詢,直到查到的結果集都爲子節點爲止,將全部查詢的結果放在集合裏放回。(層級關係多了後,執行效率不敢看)
  • 寫存儲過程解決(百度到的方式,怎麼實現我本身也沒看明白..)

這兩種方式不管是時間複雜度仍是業務實現難度都不是我這種懶人可以接受的。。cdn

一個大膽的想法

既然查詢的是全部的子節點,那麼從根節點結果集的子節點路徑必定是有一段是相等的。blog

  • 能不能拓展一個字段,記錄從根節點到該節點的路徑

如圖所示:咱們在新增的時候記錄一下路徑遞歸

path = 父path + pid (精華所在,細細品味)

接下來就很容易了:查詢四川的全部子節點:

  • 根節點到達四川的路徑a爲(1-32)
  • select * from table where path like "1-32%" 一句話搞定

查詢的like前綴還能匹配索引,你說美不美。

什麼,你不理解爲何能匹配索引?
這裏安利一下個人另外一篇文章

若是對你的思路有啓發,點個贊再走吧~

相關文章
相關標籤/搜索