層級的業務資料在系統中很常見,如組織機構、商品品類等。
如果要獲取層級資料的全路徑,除了快取起來,就是遞迴訪問的方式了:
將層級資料快取在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 原始...