mysql 递归遍历 树结构

本文详细介绍了在MySQL中如何通过递归查询来处理树形结构数据,包括使用group_concat函数进行列转行操作,以及创建递归函数实现父子节点的数据聚合和遍历。通过具体实例展示了如何构建和查询具有层级关系的组织结构。

参考大佬地址

mysql递归查询
https://blog.csdn.net/weixin_35756522/article/details/81876534
Mysql group_concat的反向应用实现(Mysql列转行)
http://blog.chinaunix.net/uid-411974-id-3990697.html
MySQL实现递归查找树形结构
https://blog.csdn.net/qq_34120430/article/details/84969235

创建表

DROP TABLE IF EXISTS vrv_org_tab;
CREATE TABLE vrv_org_tab (
id bigint(8) NOT NULL AUTO_INCREMENT,
org_name varchar(50) NOT NULL,
org_level int(4) NOT NULL DEFAULT ‘0’,
org_parent_id bigint(8) NOT NULL DEFAULT ‘0’,
PRIMARY KEY (id),
UNIQUE KEY unique_org_name (org_name)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;
INSERT INTO vrv_org_tab VALUES (‘1’, ‘北信源’, ‘1’, ‘0’);
INSERT INTO vrv_org_tab VALUES (‘2’, ‘北京’, ‘2’, ‘1’);
INSERT INTO vrv_org_tab VALUES (‘3’, ‘南京’, ‘2’, ‘1’);
INSERT INTO vrv_org_tab VALUES (‘4’, ‘武汉’, ‘2’, ‘1’);
INSERT INTO vrv_org_tab VALUES (‘5’, ‘上海’, ‘2’, ‘1’);
INSERT INTO vrv_org_tab VALUES (‘6’, ‘北京研发中心’, ‘3’, ‘2’);
INSERT INTO vrv_org_tab VALUES (‘7’, ‘南京研发中心’, ‘3’, ‘3’);
INSERT INTO vrv_org_tab VALUES (‘8’, ‘武汉研发中心’, ‘3’, ‘4’);
INSERT INTO vrv_org_tab VALUES (‘9’, ‘上海研发中心’, ‘3’, ‘5’);
INSERT INTO vrv_org_tab VALUES (‘10’, ‘北京EMM项目组’, ‘4’, ‘6’);
INSERT INTO vrv_org_tab VALUES (‘11’, ‘北京linkdd项目组’, ‘4’, ‘6’);
INSERT INTO vrv_org_tab VALUES (‘12’, ‘南京EMM项目组’, ‘4’, ‘7’);
INSERT INTO vrv_org_tab VALUES (‘13’, ‘南京linkdd项目组’, ‘4’, ‘7’);
INSERT INTO vrv_org_tab VALUES (‘14’, ‘武汉EMM项目组’, ‘4’, ‘8’);
INSERT INTO vrv_org_tab VALUES (‘15’, ‘武汉linkdd项目组’, ‘4’, ‘8’);
INSERT INTO vrv_org_tab VALUES (‘16’, ‘上海EMM项目组’, ‘4’, ‘9’);
INSERT INTO vrv_org_tab VALUES (‘17’, ‘上海linkdd项目组’, ‘4’, ‘9’);
##查询父类ID为 1  的所有数据 聚合显示
	SELECT GROUP_CONCAT(id) AS ids 
	FROM vrv_org_tab
	WHERE org_parent_id = 1 
	
	
	##strlist:一个由英文逗号“,”链接的字符串,例如:"a,b,c,d",该字符串形式上类似于SET类型的值被逗号给链接起来。
	##示例:SELECT FIND_IN_SET('b','a,b,c,d'); //返回值为2,即第2个值
	
	SELECT GROUP_CONCAT(id) AS ids 
	FROM  vrv_org_tab 
	WHERE FIND_IN_SET(org_parent_id,'1')
	
	
	
	## 递归函数
		DELIMITER $$
		USE `kettle`$$
		DROP FUNCTION IF EXISTS `getChildLst`$$
		CREATE DEFINER=`root`@`%` FUNCTION `getChildLst4`(ids INT) RETURNS VARCHAR(1000) CHARSET utf8
		    READS SQL DATA
		BEGIN
			  DECLARE sTemp VARCHAR(1000);			  
			  DECLARE sTempChd VARCHAR(1000);
			  	
			  SET sTempChd =CAST(ids AS CHAR);
			  SET sTemp = sTempChd;

			  WHILE sTemp IS NOT NULL DO									  
			    SELECT GROUP_CONCAT(id) INTO sTemp FROM vrv_org_tab WHERE FIND_IN_SET(org_parent_id,sTemp)>0;
					
			    IF (sTemp IS NOT NULL ) THEN 
				SET sTempChd = CONCAT(sTempChd,',',sTemp);
			    END IF;
			  END WHILE;

		  RETURN sTempChd;
		END$$
		DELIMITER ;
	
	
	
	
	##运行函数
	SELECT * ,getChildLst4(id) ids
	FROM vrv_org_tab
	
	
	
	## 将子级数据进行分割遍历
	SELECT
	    b.id, SUBSTRING_INDEX(  SUBSTRING_INDEX(b.ids, ',', a.id ), ',' ,- 1 ) ids
	FROM  (	SELECT * ,getChildLst4(id) ids
		FROM vrv_org_tab
		) a
	INNER  JOIN (
		SELECT * ,getChildLst4(id) ids
		FROM vrv_org_tab
		) b  
	WHERE  a.id  BETWEEN 1 AND ( SELECT 1 + LENGTH(b.ids) - LENGTH(REPLACE(b.ids, ',', '')) )
	ORDER BY   b.id
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值