本文主要是介绍【mysql 递归查询】Mysql中的递归层次查询(父子查询),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最近遇到了一个问题,在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询?
SELECT id,name,parent_id from b_company
数据长这样子,id是父节点,parent_id 是子节点
id name parent_id
1 草根总公司
24 浙江金爱农网络科技有限公司 1
25 衢州分公司 24
26 江山直营点 25
27 宁波分公司 24
28 常山直营点 25
29 衢江直营点 25
30 龙游直营点 25
31 开化直营点 25
32 金华分公司 24
33 丽水分公司 24
34 鄞州直营点 27
35 余姚直营点 27
36 金东直营点 32
37 永康直营点 32
38 莲都直营点 33
....
....
下面给出一个function来完成方法
根据传入id查询所有父节点的id
CREATE FUNCTION `getParList`(rootId INT) RETURNS varchar(1000) CHARSET utf8
BEGINDECLARE sTemp VARCHAR(1000);DECLARE sTempPar VARCHAR(1000); SET sTemp = ''; SET sTempPar =rootId; #循环递归WHILE sTempPar is not null DO #判断是否是第一个,不加的话第一个会为空IF sTemp != '' THENSET sTemp = concat(sTemp,',',sTempPar);ELSESET sTemp = sTempPar;END IF;SET sTemp = concat(sTemp,',',sTempPar); SELECT group_concat(parent_id) INTO sTempPar FROM b_company where parent_id<>id and FIND_IN_SET(id,sTempPar)>0; END WHILE; RETURN sTemp;
END
根据子节点 查询所有父节点
select id,name,parent_id from b_company where FIND_IN_SET(id,getParList(35));
id name parent_id
1 草根总公司
24 浙江金爱农网络科技有限公司 1
27 宁波分公司 24
35 余姚直营点 27
######查询优化
######方法1:
select getParList_information(2697) into @m1;
SELECTid,pid,name
FROMbusi_information_config
WHEREFIND_IN_SET(id,(select @m1))######方法2:SELECTid,pid,name
FROMbusi_information_config ,(select getParList_information(2697) as tmp)t
WHEREFIND_IN_SET(id,t.tmp)
尽量用临时表 传给函数,提高查询效率
这篇关于【mysql 递归查询】Mysql中的递归层次查询(父子查询)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!