Mysql 递归查询子类Id的所有父类Id

🐔问题描述


最近开发过程中遇到一个问题,每次添加代理关系都要去递归查询一下它在不在这个代理关系树上.
很麻烦性能也比较差.想着把代理关系的父类全部存起来,
但是有涉及修复历史数据,不想写java代码去实现,干脆写函数解决.
所以函数中部分代码也是根据业务情况所写,可行判断增减

🐧先看结果


在这里插入图片描述

🐧表结构展示


表名(t_agent_user_relation)
字段名字段类型描述
current_user_idint当前用户id
superior_user_idint代理用户id
parent_idsvarchar父类Id集合以逗号隔开
parent_idint父类ID
idint主键

🐧实现递归查询集合


🐙函数实现过程分析


函数实现过程:

  • 根据子类Id查询父类Id
  • 根据父类Id 查询 父类的父类ID 以此循环,终止条件如下
    • 查询到的父类为空
    • 出现三次重复父类Id 避免 A=>B=>C=>A 等情况出现死循环

🐙函数具体代码


create
    definer = root@`%` function getParentIds(child_id int) returns varchar(255)
BEGIN
    DECLARE parent_id varchar(255) default '';
    DECLARE parent_ids VARCHAR(1500) default '';
    DECLARE count int;
    DECLARE sum int default 0;

    -- 获取当前子类的父类ID
    SELECT superior_user_id INTO parent_id FROM t_agent_user_relation WHERE current_user_id = child_id;


    -- 递归查询所有父类ID
    WHILE parent_id is not null && sum < 3
        DO
            SET parent_ids = CONCAT_WS(',', parent_ids, parent_id);
            SELECT count(1) into count FROM t_agent_user_relation WHERE current_user_id = parent_id;
            if count = 0 then
                set parent_id = null;
            else
                SELECT superior_user_id INTO parent_id FROM t_agent_user_relation WHERE current_user_id = parent_id;
            end if;
            -- 防止出现死循环
            if parent_id is not null && find_in_set(parent_id, parent_ids) > 0
            then
                set sum = sum + 1;
            else
                set sum = sum;
            end if;
        END WHILE;
    RETURN parent_ids;
END;

如果出现以下错误
[HY000][1418] This function has none of DETERMINISTIC, NO SQL, or READS SQL

  • 执行set global log_bin_trust_function_creators = 1;
  • 简单介绍一下,当二进制日志启用后,这个变量就会启用。它控制是否可以信任存储函数创建者,不会创建写入二进制日志引起不安全事件的存储函数。如果设置为0(默认值),用户不得创建或修改存储函数,除非它们具有除CREATE ROUTINEALTER ROUTINE特权之外的SUPER权限。 设置为0还强制使用DETERMINISTIC特性或READS SQL DATANO SQL特性声明函数的限制。 如果变量设置为1,MySQL不会对创建存储函数实施这些限制。 此变量也适用于触发器的创建。

🐧查询结果


select  current_user_id,superior_user_id,getParentIds(current_user_id) from t_agent_user_relation

在这里插入图片描述

🐧修复数据


update t_agent_user_relation set    parent_ids=  getParentIds(current_user_id)  where parent_ids is null
  • 32
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值