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