MySQL通过自定义函数实现递归查询父级ID或者子级ID
背景:
在MySQL中如果是有限的层次,比如我们事先如果可以确定这个树的最大深度,那么所有节点为根的树的深度均不会超过树的最大深度,则我们可以直接通过leftjoin来实现。
但很多时候我们是无法控制或者是知道树的深度的。这时就需要在MySQL中用存储过程(函数)来实现或者在程序中使用递归来实现。本文讨论在MySQL中使用函数来实现的方法:
一、环境准备
1、建表
CREATETABLE`table_name`( `id`int(11)NOTNULLAUTO_INCREMENT, `status`int(255)NULLDEFAULTNULL, `pid`int(11)NULLDEFAULTNULL, PRIMARYKEY(`id`)USINGBTREE )ENGINE=InnoDBAUTO_INCREMENT=1CHARACTERSET=utf8COLLATE=utf8_general_ciROW_FORMAT=Dynamic;
2、插入数据
INSERTINTO`table_name`VALUES(1,12,0); INSERTINTO`table_name`VALUES(2,4,1); INSERTINTO`table_name`VALUES(3,8,2); INSERTINTO`table_name`VALUES(4,16,3); INSERTINTO`table_name`VALUES(5,32,3); INSERTINTO`table_name`VALUES(6,64,3); INSERTINTO`table_name`VALUES(7,128,6); INSERTINTO`table_name`VALUES(8,256,7); INSERTINTO`table_name`VALUES(9,512,8); INSERTINTO`table_name`VALUES(10,1024,9); INSERTINTO`table_name`VALUES(11,2048,10);
二、MySQL函数的编写
1、查询当前节点的所有父级节点
delimiter// CREATEFUNCTION`getParentList`(root_idBIGINT) RETURNSVARCHAR(1000) BEGIN DECLAREkINTDEFAULT0; DECLAREfidINTDEFAULT1; DECLAREstrVARCHAR(1000)DEFAULT'$'; WHILErootId>0DO SETfid=(SELECTpidFROMtable_nameWHEREroot_id=id); IFfid>0THEN SETstr=concat(str,',',fid); SETroot_id=fid; ELSE SETroot_id=fid; ENDIF; ENDWHILE; RETURNstr; END// delimiter;
2、查询当前节点的所有子节点
delimiter// CREATEFUNCTION`getChildList`(root_idBIGINT) RETURNSVARCHAR(1000) BEGIN DECLAREstrVARCHAR(1000); DECLAREcidVARCHAR(1000); DECLAREkINTDEFAULT0; SETstr='$'; SETcid=CAST(root_idASCHAR);12WHILEcidISNOTNULLDO IFk>0THEN SETstr=CONCAT(str,',',cid); ENDIF; SELECTGROUP_CONCAT(id)INTOcidFROMtable_nameWHEREFIND_IN_SET(pid,cid)>0; SETk=k+1; ENDWHILE; RETURNstr; END// delimiter;
三、测试
1、获取当前节点的所有父级
SELECTgetParentList(10);
2、获取当前节点的所有字节
SELECTgetChildList(3);
总结
以上所述是小编给大家介绍的MySQL通过自定义函数实现递归查询父级ID或者子级ID,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。