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

被折叠的 条评论
为什么被折叠?



