mysql 实现树形递归查询 适合分级菜单、层级权限等查询

Oracle的树形递归查询可以使用Oracle中自带的方法:

start with ... connect by 

语法格式是:

**select 字段名,字段名...  from 表名 start with 根节点(字段名=字段值)connect by prior id = pId**

start with 表示以什么为根节点 ,如果不加限制 可以写 1=1 ;
connect by 后面是必须要加条件的,比如id = pId
prior 如果在 = 的前面表示以pId为根节点,在后面是另外一种含义了

可以这么理解:

prior child_Id = parent_Id 《=》 parent_Id = prior child_Id;
prior parent_Id = child_Id 《=》child_Id = prior parent_Id;

比如第一个就是找孩子:就是自顶向下的,第二个找父亲就是自底向上的;

实际开发中:

<select id="listUnitInfo" resultType="com.sout.admin.model" databaseId="oracle">
		select distinct u.unit_code,
	          u.unit_name,
	          u.unit_tel,
	          u.para_unit_code
	     from lzcity_approve_unit_info u
		 start with 1 = 1
		 #非必需条件
		 <if test="unitCode != null and unitCode !=''">
		 	and u.根节点字段名 = #{根节点}
		 </if>
		   #下面这个是必须要写的条件
		 <if test="unitName!=null and unitName!=''">
			and u.unit_name like '%'|| #{unitName} ||'%'
		 </if>
		 connect by prior u.unit_code = u.para_unit_code
		 	and u.unit_code &lt;>u.para_unit_code
	</select>

mysql实际开发中,实际上MySQL没有相应的函数/方法,这里借用一位前辈写的自定义函数加上MySQL自有的FIND_IN_SET函数来实现我自己的树形递归查询
xml式:

<select id="listUnitInfo" resultType="com.sout.admin.model" databaseId="mysql">
		select distinct *
	     from frontsetting f
	     <where>
			 <if test="modelid != null and modelid !=''">
			 	and find_in_set(f.modelid,getunitChildList(#{modelid}))
			 </if>
		 </where>
	</select>

注解式:

@Select("select distinct * from frontsetting f where  find_in_set(f.modelid,getunitChildList(#{modelid})")
List<FrontSetting> ModelCollection(String modelId);

自定义函数getunitChildList:

DELIMITER $$

USE `gd_base`$$

DROP FUNCTION IF EXISTS `getUnitChildList`$$

CREATE DEFINER=`root`@`%` FUNCTION `getUnitChildList`(rootId INT) RETURNS VARCHAR(1000) CHARSET utf8
BEGIN
      DECLARE sChildList VARCHAR(1000);
      DECLARE sChildTemp VARCHAR(1000);
      SET sChildTemp =CAST(rootId AS CHAR);
      WHILE sChildTemp IS NOT NULL DO
        IF (sChildList IS NOT NULL) THEN
          SET sChildList = CONCAT(sChildList,',',sChildTemp);
	ELSE
	  SET sChildList = CONCAT(sChildTemp);
	END IF;
        SELECT GROUP_CONCAT(modelid) INTO sChildTemp FROM frontsetting WHERE FIND_IN_SET(lastmodelid,sChildTemp)>0;
        END WHILE;
      RETURN sChildList;
END$$

DELIMITER ;

这个自定义函数有些部分需要改成自己的内容:

USE gd_base$$ 换成自己的数据库名
DEFINER=root@% 换成自己的用户信息

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前后端杂货铺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值