在做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中的循環去查詢取值,一直也覺得非常麻煩而且沒有效率,但是直到今天才學到這麼簡便高效的方法,真的是活到老、學到老,在計算機領域,我們永遠都是什麼都不懂的小屁孩吧。