mysql使用函數查詢樹形數據

在做web項目時,經常需要查詢出樹形數據,比如國家-省-市-區,之前一直使用java的循環嵌套進行查詢,但是多次與數據庫交互,效率非常低下,於是在網上找到一種解決方法,把嵌套循環這一過程放在mysql中去處理,效率大大提高。
轉載自:多級樹形結構和sql查詢實現


廢話不多說,先上總的數據
這裏寫圖片描述


現在我要查出所有河南省極其下屬的數據,結果如下
這裏寫圖片描述


效果不錯吧,下面是該函數源碼

delimiter /
DROP FUNCTION IF EXISTS `mydb`.`getChild`/
CREATE FUNCTION `getChild`(rootId varchar(36))
  RETURNS VARCHAR(1000)
  BEGIN
    DECLARE ptemp VARCHAR(1000);
    DECLARE ctemp VARCHAR(1000);
    SET ptemp = '#';
    SET ctemp = rootId;
    WHILE ctemp IS NOT NULL DO
      SET ptemp = concat(ptemp, ',', ctemp);
      SELECT group_concat(id)
      INTO ctemp
      FROM t_tree_table
      WHERE FIND_IN_SET(pid, ctemp) > 0;
    END WHILE;
    RETURN ptemp;
  END;

下面是查詢語句,只要在getChild的參數中輸入需要查詢的父級id即可,

例如示例數據中的 河南 的 id 爲 2.

 select * from t_tree_table where find_in_set(id,getChild(2));

若要拼接成樹控件用的多層級的JSON數據,可以參考我另一篇博客
java+mysql遞歸拼接樹形JSON列表


感慨:做java web開發也有兩年之久了,漸漸沒有剛進入工作崗位時那種求知慾了,漸漸習慣用既有的知識去處理問題,但是我用的方法、算法,真的是最高效的嗎?難道就沒有更好的解決辦法?不,並不是,就像這個看似簡單的樹形結構,一直以來都是通過java中的循環去查詢取值,一直也覺得非常麻煩而且沒有效率,但是直到今天才學到這麼簡便高效的方法,真的是活到老、學到老,在計算機領域,我們永遠都是什麼都不懂的小屁孩吧。

發佈了74 篇原創文章 · 獲贊 40 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章