MySQL MySQL層級資料的遞迴遍歷

2022-03-26 17:15:15 字數 1609 閱讀 7266

層級的業務資料在系統中很常見,如組織機構、商品品類等。

如果要獲取層級資料的全路徑,除了快取起來,就是遞迴訪問的方式了:

將層級資料快取在redis中,用redis遞迴獲取層級結構。此方法效率高。

在mysql中做遞迴遍歷,(oracle有遞迴的語法支援,而mysql並沒有),需要自己寫函式去遞迴。此方法效率低。

程式執行基於效率要求,一般使用redis去遞迴。本次,因為初始化資料需要,寫了乙份mysql函式去遞迴:

/* 根據id獲取級聯編碼路徑 */

create function `f_org_recursion`(

v_id integer

) returns varchar(1024)

begin

/* 編碼 */

declare v_code varchar(1024);

/* 編碼路徑 */

declare v_cascade_code varchar(1024);

/* 父節點id */

declare v_parent_id int;

/* 遞迴操作的層次 */

declare v_recursion_level int;

set v_cascade_code = '';

set v_recursion_level = 0;

/* 查詢本節點**、和父節點id */

select t.code, t.parent_id into v_code, v_parent_id from t_organ t where t.id = v_id;

/* 是否為空 */

if v_code is null then

return concat('no record for id ', v_id);

else

set v_cascade_code = concat('', v_code);

end if;

/* 遞迴拼接** */

while v_parent_id is not null do

/* 遞迴層次限制,避免死迴圈 */

set v_recursion_level = v_recursion_level + 1;

if v_recursion_level > 20 then

return 'recursion out of 20 times';

end if;

/* 以父id為id查詢 */

select t.code, t.parent_id into v_code, v_parent_id from t_organ t where t.id = v_parent_id;

/* 是否為空 */

if v_code is null then

return concat('no record for parent id ', v_parent_id);

else

set v_cascade_code = concat(v_code, '-', v_cascade_code);

end if;

end while;

return v_cascade_code;

end

Php無限層級,並顯示層級數

這裡的arr是直接從資料庫取出的,僅作為測試資料 arr array array id 1,name 一級選單a pid 0 pid 父級id array id 2,name 一級選單b pid 0 array id 3,name 二級選單a pid 1 array id 4,name 二級選單b ...

MySQL 無限層級資料表設計

需求 使用者a介紹b入會,b成為a的下線,b再發展c d等下線,c d也允許發展下線,不限制層級,但是每個人只允許有乙個上線 類似 傳銷 典型的樹結構 問題 快速查詢某人的所有上線 快速查詢某人的所有下線 快速為某人增加乙個下線 方案有以下四種,各自的定義和利弊請看 前輩的文件 一 鄰接表 依賴父節...

C 不用遞迴,獲取無限層級資料

物件屬性 public class reslist public listchild null public int parent public int rank 資料就是那種有父級id的那種 1 listreslist new list 新的資料 2 listalllist new list 原始...