Mysql下的递归查询

递归查询是什么

递归查询也叫树查询,根据树的头能查出他之下的所有节点
递归调用自身,将查询的结果作为参数再次查询以得出最后的结果。

比如浙江省下面有杭州市,温州市,温州市下面有鹿城区,龙湾区等等,如果通过一个SQL语句中使用where我们可以查出浙江省及它的下面直属市如温州,而递归查询的意思就是,将温州作为原浙江省的参数查出温州的直属市查出温州的直属等,最后得到浙江省下面的所有县市区等等。

Oracle递归查询

Oracle中递归查询可以用start with…connect by prior很方便的实现
一开始接触过Oracle的递归查询来做部门,所以现在对MySql的递归实现吐槽了很久…

MySql递归查询

MySql并没有提供这样的函数,递归查询通常用在部门管理、权限、菜单等功能上,之前一直是用的函数来实现,但是Mysql下虽然使用函数可以实现递归查询,依旧会有着效率上的问题,并且函数的字段会有长度受限。
然后偶然发现另一种方法也可以实现曲线救国,这里提供两种查询方式。

MySql递归查询函数第一种实现

BEGIN
DECLARE sTemp VARCHAR(21844);
DECLARE sTempChd VARCHAR(21844);
DECLARE length VARCHAR(21844);
SET sTemp = '$';
SET sTempChd = cast(pid  as char);

WHILE sTempChd is not NULL DO
SET sTemp = CONCAT(sTemp,',',sTempChd);
#简单修改一下表和字段即可
SELECT group_concat(id)  INTO sTempChd FROM sys_group where FIND_IN_SET(parent_id,sTempChd)>0;

END WHILE;
#如果查询结果不想包含自身则长度结果-1,如查浙江省下属市县而不需要浙江省自身
SET length = length(sTemp) - length(REPLACE (sTemp, ',', ''));

SET sTemp = substring_index(sTemp,',',-length);
return sTemp;
END

这种方式实现的递归也是我一开始用的,后来发现数据量稍微多起来他的效率就会很慢,并且因为字段有长度限制,一些过长的UUID导致查询的结果过长就会失败,优点在于使用上只用通过一个ID就能查到所有下属比较方便。

MySql递归查询-曲线救国实现

递归查询树
通过前端的表格将所有的id传递到后台,查询的时候通过查
id in(123,456,789,传过来的数据) 这种形式。
也能更灵活的添加减少要查询的区域。
这种实现方式也不能叫递归查询,只能说是实现换了一个思路。
在某些情况下会不如之前的递归查询好用,想一想后台如果要查某个地区的下属数据,递归只需要传递一个ID,而这种方式需要先查出需要的ID然后才能查。
也是我最近发现的一个新做法,分享到博客。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值