首先要说明的是表用的是树状表,即表中含有两个重要字段,即 每一条数据有id 和关联父级的 pid
如果不是树状表或者查询量非常庞大的话 就请掠过此文!因为此种建表结合mysql函数递归查询方式数据库压力比较大!
如下是代码,表名是test 字段包含 id ,pid ,如下函数中红色标记部分是 表名或者 字段名不同的 复制代码后可以根据自己的更改即可。
查询所有父级信息的mysql函数:
CREATE DEFINER=`root`@`localhost` 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 pid FROM test WHERE 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;
查询语句: select * from test where FIND_IN_SET(id,getParentList('10')); 结果为每条父类信息数组
select getParentList('10'); 所有父类的id
查询所有子级信息的mysql函数:
CREATE DEFINER=`root`@`localhost` 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 = concat(str, ',', cid);
SELECT group_concat(id) INTO cid FROM test where FIND_IN_SET(pid, cid) > 0;
END WHILE;
RETURN str;
END;
查询语句:select * from test where FIND_IN_SET(id,getChildList('10'));
select getChildList('10'); 所有子类的id