mysql 根据父Id 递归查询所有的子类Id,根据子类Id 递归查询所有的父类 Id

一、根据父Id 递归查询所有的子类Id         

应用场景:

          在树形组件的开关中会用到,如下图所示:

技术手段:用mysql函数实现,如下:

函数名:getSonIds

BEGIN
    DECLARE sTemp VARCHAR(1000);
    DECLARE sTempChd VARCHAR(1000);
    SET sTemp = '';
    SET sTempChd =cast(rootId as CHAR);
    WHILE sTempChd is not null DO
        SET sTemp = concat(sTemp,',',sTempChd);
        SELECT group_concat(表Id) INTO sTempChd FROM  查询的表名 where FIND_IN_SET(父Id,sTempChd)>0;
    END WHILE;
    RETURN sTemp; 
END

下面我用一张产品分类表(tbl_product_category)做例子,下图是它的字段

例子:1、先写好名为getSonIds的函数

CREATE DEFINER=`root`@`%` FUNCTION `getCommentIds`(rootId VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
    DETERMINISTIC
BEGIN
    DECLARE sTemp VARCHAR(1000);
    DECLARE sTempChd VARCHAR(1000);
    SET sTemp = '';
    SET sTempChd =cast(rootId as CHAR);
    WHILE sTempChd is not null DO
        SET sTemp = concat(sTemp,',',sTempChd);
        SELECT group_concat(comment_id) INTO sTempChd FROM  ssc_posts_comment where FIND_IN_SET(parent_id,sTempChd)>0;
    END WHILE;
    RETURN sTemp; 
END

2、mybatis xml中调用它

SELECT getSonIds(#{categoryPid})

二、根据子类Id 递归查询所有的父类 Id    

技术手段:也是函数解决:

函数名:getParentIds

CREATE DEFINER=`root`@`%` FUNCTION `getCommentParentIds`(rootId VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
    DETERMINISTIC
BEGIN  
		DECLARE i varchar(100) default '';  
		DECLARE j varchar(1000) default rootId;  
			 
		WHILE rootId is not null  do  
				SET i =(SELECT parent_id FROM ssc_posts_comment WHERE comment_id = rootId);  
				IF i is not null THEN  
						SET j = concat(j, ',', i);  
						SET rootId = i;  
				ELSE  
						SET rootId = i;  
				END IF;  
		END WHILE;  
		return j; 
END

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一种基于Java的持久层框架,它提供了许多强大的功能来简化数据库操作。在使用MyBatis进行递归查询时,我们可以通过按ID树进行查询来获取满足条件的结果。 要实现递归查询,我们可以使用MyBatis的循环引用来建立关系。在数据库表中,我们通常会有一个字段用来存储ID,以建立树形结构。下面是一个示例表结构: ``` id | name | parentId ----------------------- 1 | A | null 2 | B | 1 3 | C | 1 4 | D | 2 ``` 假设我们要查询以A为根节点的树形结构,可以通过以下步骤来实现: 1. 创建一个Mapper接口,定义一个方法用于查询以指定ID为根节点的树形结构: ```java public interface TreeMapper { List<Node> queryTreeByParentId(String parentId); } ``` 2. 创建一个ResultMap,用于映射查询结果到对象: ```xml <resultMap id="NodeResultMap" type="com.example.Node"> <id property="id" column="id"/> <result property="name" column="name"/> <association property="children" javaType="java.util.List" resultMap="NodeResultMap"/> </resultMap> ``` 3. 编写SQL语句进行递归查询,可以使用SELECT、JOIN和WHERE等关键字来实现: ```xml <select id="queryTreeByParentId" resultMap="NodeResultMap"> SELECT n1.id, n1.name, n2.id as childId, n2.name as childName FROM my_table n1 LEFT JOIN my_table n2 ON n1.id = n2.parentId WHERE n1.id = #{parentId} </select> ``` 4. 在Mapper接口中实现该方法: ```java public List<Node> queryTreeByParentId(String parentId); ``` 通过以上步骤,我们可以实现根据ID递归查询的功能。调用该方法时,传入指定的ID,可以获取到满足条件的树形结构。每个节点对象都可以包含一个节点集合,用于表示树结构。 总结:利用MyBatis的循环引用和ResultMap的嵌套,我们可以很方便地实现根据ID树进行递归查询。这种方式简化了SQL语句的编写,并提供了方便的对象映射功能,使得操作数据库变得更加简单和高效。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值