MySQL递归所有节点

当一张表中存储的数据内容是级联关系的时候,比如菜单,一级菜单下面有二级菜单,二级菜单下面有三级菜单,如何通过查询将一个节点下面所有的菜单都查询出来呢?下面进行一系列操作来处理这个问题!

表:

CREATE TABLE `btd_sys_menu` (
  `menu_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `parent_id` bigint(20) DEFAULT NULL COMMENT '父菜单ID,一级菜单为0',
  `name` varchar(50) DEFAULT NULL COMMENT '菜单名称',
  `url` varchar(200) DEFAULT NULL COMMENT '菜单URL',
  `perms` varchar(500) DEFAULT NULL COMMENT '授权(多个用逗号分隔,如:user:list,user:create)',
  `type` int(11) DEFAULT NULL COMMENT '类型   0:目录   1:菜单   2:按钮',
  `icon` varchar(50) DEFAULT NULL COMMENT '菜单图标',
  `order_num` int(11) DEFAULT NULL COMMENT '排序',
  `gmt_create` datetime DEFAULT NULL COMMENT '创建时间',
  `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`menu_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=822 DEFAULT CHARSET=utf8 COMMENT='菜单管理';

表数据长这样:

一、查找子结点:

创建函数:

CREATE FUNCTION `getChildList`(rootId varchar(100)) RETURNS varchar(2000) CHARSET utf8
BEGIN   
	DECLARE str varchar(2000);  
	DECLARE cid varchar(100);   
	SET str = '';   
	SET cid = rootId;   
	WHILE cid is not null DO   
			SET str = if(str='',cid,concat(str, ',', cid));   
			SELECT group_concat(menu_id) INTO cid FROM kyrpt.btd_sys_menu where FIND_IN_SET(parent_id, cid) > 0;   
	END WHILE;   
	RETURN str;   
END

查询sql:

select getChildList(#{menu_id}) AS id;

二:查找父节点:

创建函数:

CREATE FUNCTION `getParentList`(rootId varchar(100)) RETURNS varchar(1000) CHARSET utf8
BEGIN   
	DECLARE fid varchar(100) default '';   
	DECLARE str varchar(1000) default rootId;   
		
	WHILE rootId is not null  do   
			SET fid =(SELECT parent_id FROM kyrpt.btd_sys_menu WHERE menu_id = rootId);   
			IF fid is not null THEN   
					SET str = concat(str, ',', fid);   
					SET rootId = fid;   
			ELSE   
					SET rootId = fid;   
			END IF;   
	END WHILE;   
	return str;  
END

查询sql:

select getParentList(#{menu_id}) AS id;

注意:查询结果有长度限制;

> Data too long for column 'cid' at row 366