这篇文章给大家介绍怎么在MySQL中通过自定义函数实现递归查询父级ID或者子级ID,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

一、环境准备

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)BEGINDECLAREkINTDEFAULT0;  DECLAREfidINTDEFAULT1;  DECLAREstrVARCHAR(1000)DEFAULT'$';  WHILErootId>0DOSETfid=(SELECTpidFROMtable_nameWHEREroot_id=id);IFfid>0THENSETstr=concat(str,',',fid);SETroot_id=fid;ELSESETroot_id=fid;ENDIF;ENDWHILE;  RETURNstr;END//delimiter;

2、查询当前节点的所有子节点

delimiter//CREATEFUNCTION`getChildList`(root_idBIGINT)RETURNSVARCHAR(1000)BEGINDECLAREstrVARCHAR(1000);DECLAREcidVARCHAR(1000);DECLAREkINTDEFAULT0;SETstr='$';SETcid=CAST(root_idASCHAR);12WHILEcidISNOTNULLDOIFk>0THENSETstr=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就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。