mysql循環查詢樹狀數據


完整function

CREATE  FUNCTION `getChildList`(rootId BIGINT, table_name varchar(20)) RETURNS varchar(21845) CHARSET utf8
BEGIN 
       DECLARE str VARCHAR(21845) ; 
       DECLARE cid VARCHAR(21845) ; 
       
       SET str = ''; 
       SET cid =cast(rootId as CHAR); 
             
       WHILE cid is not null DO 
         SET str= concat(str,',',cid); 
                 IF table_name = 'tb_menu' THEN
                    SELECT group_concat(id) INTO cid from tb_menu where FIND_IN_SET(p_id,cid)>0;
                 ELSEIF table_name = 'tm_service_category' THEN
                    SELECT group_concat(pk_id) INTO cid FROM tm_service_category where FIND_IN_SET(p_id,cid)>0;
                 ELSEIF table_name = 'tm_part_category' THEN
                    SELECT group_concat(pk_id) INTO cid FROM tm_part_category  where is_del = 0 and FIND_IN_SET(p_id,cid)>0;
                 end IF;
       END WHILE; 
       RETURN str; 
END

mysql查詢樹解析(此處只是簡單的循環並非遞歸):
例如:調用如下

select getChildList(0,tm_service_category)

提煉執行語句

       WHILE cid is not null DO 
         SET str= concat(str,',',cid); 
            SELECT group_concat(pk_id) INTO cid FROM tm_service_category where FIND_IN_SET(p_id,cid)>0;
       END WHILE; 
       RETURN str; 
        END

tm_service_category 表結構如下

CREATE TABLE `tm_service_category` (
  `pk_id` bigint(20) unsigned NOT NULL COMMENT '主鍵',
  `name` varchar(50) DEFAULT NULL COMMENT '名稱',
  `p_id` bigint(20) unsigned DEFAULT NULL COMMENT '父節點',
  PRIMARY KEY (`pk_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

最主要的是p_id字段,表示父節點的pk_id

假設有數據如下

pk_id p_id name
1 0 a
2 1 b
3 1 c
4 2 d

樹結構如下:

整棵樹的根節點為0,二級節點1,三級節點為2,3,四級節點為4

模擬執行循環語句

       WHILE cid is not null DO 
         SET str= concat(str,',',cid); 
            SELECT group_concat(pk_id) INTO cid FROM tm_service_category where FIND_IN_SET(p_id,cid)>0;
       END WHILE; 
       RETURN str; 
        END

getChildList(0,tm_service_category)

1,初始化cid=0
2,查找p_id為0的所有節點拿到所有二級節點賦值給cid,cid=1,str=0,1
3,重復2步操作,查找p_id為1的所有節點拿到所有二級節點賦值給cid,cid=2,3,str=0,1,2,3
4,重復2步操作,查找p_id為2,3的所有節點拿到所有三級節點賦值給cid,cid=4,str=0,1,2,3,4
5,重復2步操作,查找p_id為4的所有節點賦值給cid,沒找到任何節點,cid=null,退出循環


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM