本文主要介绍Mysql树递归查询的实现方法,通过示例代码进行了详细介绍,对您的学习或工作有一定的参考价值。有需要的朋友一起学习吧。
前言
对于数据库中的树形结构数据,比如部门表,有时候,我们需要知道一个部门的所有下属部门或者某个部门的所有上级部门。这时候就需要用到mysql递归查询了。
最近在项目迁移中,把oracle版本迁移到mysql版本,遇到了一些Oracle函数,但是Mysql没有,我只好自定义函数或者想办法替换掉。
Oracle递归查询
Oracle可以使用start with.通过连接实现递归查询。
连接递归查询的基本语法是:
1从表格中选择开始于.通过以前的id=PID连接
Start with:表示什么是根节点,可以写成1=1,没有限制。如果id为123的节点是根节点,则它被写成start with id=123。
Connect by:connect by是必需的,start with在某些情况下可以省略,或者直接从1=1开始,没有限制。
prior:prior关键字可以放在等号的前面或后面,表示不同的意思。例如,prior:prior=pid表示pid是该记录的根节点。
具体可以参考我之前写的一篇甲骨文博客:https://www.jb51.net/article/156306.htm.
Oracle方面的实现
select id=' listUnitInfo ' result type=' com . admin . system . unit . model . unit model ' databaseId=' Oracle '
选择不同的单位代码,
u.unit_name
单位电话,
u.para _单位代码
来自lzcity_approve_unit_info u
从1=1开始
if test='unitCode!=null和unitCode!='''
u.unit_code=#{unitCode}
/如果
if test='unitName!=null和unitName!='''
和u.unit_name,如“%”| | # { unitName } | | ' % '
/如果
通过先前的u.unit_code=u.para_unit_code连接
和u.unit _ code ltu.para _单位代码
/选择
Mysql递归查询
下面主要介绍Mysql的实现。Mysql不提供类似的功能,只能通过自定义函数来实现。网上有很多这样的资料,但是我已经不知道文章是原创了。这篇博客写得很好,https://www.jb51.net/database/201209/152513.html.我也用下面作者提供的方法来实现我自己。感谢作者的分享。
这里借用作者提供的自定义函数,加上Find_in_set函数find _ in _ set (u.unit _ code,getunitChildList (# {unitcode})),getunitChildList就是一个自定义函数。
select id=' listUnitInfo ' result type=' com . admin . system . unit . model . unit model ' databaseId=' MySQL '
选择不同的单位代码,
u.unit_name
单位电话,
u.para _单位代码
从t _单位_信息u
在哪里
if test='unitCode!=null和unitCode!='''
和find_in_set(u.unit_code,getunitChildList(#{unitCode}))
/如果
if test='unitName!=null和unitName!='''
和u.unit_name,如concat('% ',#{unitName},' % ')
/如果
/哪里
/选择
GetUnitChildList自定义函数
分隔符$$
使用` gd_base`$$
如果存在,则删除函数` getUnitChildList`$$
CREATE DEFINER=`root`@`% `函数` getUnitChildList`(rootId INT)返回VARCHAR(1000) CHARSET utf8
开始
声明sChildList VARCHAR(1000);
声明sChildTemp VARCHAR(1000);
SET sChildTemp=CAST(rootId为CHAR);
而sChildTemp不为空DO
如果(sChildList不为空)则
SET sChildList=CONCAT(sChildList,',',schild temp);
其他
SET sChildList=CONCAT(schild temp);
结束IF;
SELECT GROUP _ CONCAT(UNIT _ code)INTO schild temp FROM LZ city _ APPROVE _ UNIT _ INFO其中FIND_IN_SET(para_unit_code,schild temp)0;
结束WHILE
返回sChildList
结束$$
分隔符;
总结
这就是本文的全部内容。希望这篇文章的内容对你的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。