mysql向下向上递归查询函数


CREATE TABLE `tb_area` (
`area_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`area_name` varchar(255) DEFAULT NULL,
`area_code` varchar(255) DEFAULT NULL,
`pid` int(10) DEFAULT NULL,
PRIMARY KEY (`area_id`)
) ENGINE=InnoDB AUTO_INCREMENT=131 DEFAULT CHARSET=utf8;

 
 
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (1, '中国', '100000', 0);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (2, '广西壮族自治区', '450000000000', 1);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (3, '防城港市', '450600000000', 2);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (4, '港口区', '450602000000', 3);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (5, '防城区', '450603000000', 3);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (6, '上思县', '450621000000', 3);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (7, '东兴市', '450681000000', 3);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (8, '渔州坪街道', '450602001000', 4);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (9, '白沙叶街道', '450602002000', 4);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (10, '沙潭江街道', '450602003000', 4);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (11, '王府街道', '450602004000', 4);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (12, '企沙镇', '450602100000', 4);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (13, '光坡镇', '450602101000', 4);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (14, '水营街道', '450603001000', 5);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (15, '珠河街道', '450603002000', 5);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (109, '文昌街道', '450603003000', 5);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (110, '大菉镇', '450603101000', 5);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (111, '华石镇', '450603102000', 5);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (112, '那梭镇', '450603103000', 5);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (113, '那良镇', '450603104000', 5);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (114, '峒中镇', '450603105000', 5);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (115, '茅岭镇', '450603106000', 5);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (116, '江山镇', '450603107000', 5);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (117, '扶隆镇', '450603108000', 5);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (118, '滩营乡', '450603204000', 5);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (119, '十万山瑶族乡', '450603209000', 5);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (120, '思阳镇', '450621100000', 6);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (121, '在妙镇', '450621101000', 6);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (122, '华兰镇', '450621102000', 6);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (123, '叫安镇', '450621103000', 6);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (124, '南屏瑶族乡', '450621203000', 6);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (125, '平福乡', '450621204000', 6);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (126, '那琴乡', '450621206000', 6);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (127, '公正乡', '450621208000', 6);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (128, '东兴镇', '450681100000', 7);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (129, '江平镇', '450681101000', 7);
INSERT INTO `tb_area`(`area_id`, `area_name`, `area_code`, `pid`) VALUES (130, '马路镇', '450681102000', 7);
View Code

 




-- 向下递归 利用find_in_set()函数和group_concat()函数实现递归查询: DROP FUNCTION IF EXISTS queryChildrenAreaInfo; CREATE FUNCTION queryChildrenAreaInfo(areaId INT) RETURNS VARCHAR(4000) BEGIN DECLARE sTemp VARCHAR(4000); DECLARE sTempChd VARCHAR(4000); SET sTemp='$'; SET sTempChd = CAST(areaId AS CHAR); WHILE sTempChd IS NOT NULL DO SET sTemp= CONCAT(sTemp,',',sTempChd); SELECT GROUP_CONCAT(area_id) INTO sTempChd FROM tb_area WHERE FIND_IN_SET(pid,sTempChd)>0; END WHILE; RETURN sTemp; END; -- 查询id为"1"下面的所有节点: SELECT queryChildrenAreaInfo(1); SELECT * FROM tb_area WHERE FIND_IN_SET(area_id,queryChildrenAreaInfo(0)); -- 向上递归 DROP FUNCTION IF EXISTS queryParentAreaInfo; CREATE FUNCTION queryParentAreaInfo(areaId INT) RETURNS VARCHAR(4000) BEGIN DECLARE sTemp VARCHAR(4000); DECLARE sTempChd VARCHAR(4000); SET sTemp='$'; SET sTempChd = CAST(areaId AS CHAR); SET sTemp = CONCAT(sTemp,',',sTempChd); SELECT pid INTO sTempChd FROM tb_area WHERE area_id = sTempChd; WHILE sTempChd <> 0 DO SET sTemp = CONCAT(sTemp,',',sTempChd); SELECT pid INTO sTempChd FROM tb_area WHERE area_id = sTempChd; END WHILE; RETURN sTemp; END; -- 查询id为"5"的节点的所有上级节点: SELECT * from tb_area where FIND_IN_SET(area_id,queryParentAreaInfo(5));

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM