• mysql递归查询,mysql创建函数


    1、需求背景:

    如有以下数据,需要根据COMID获取对应COMLEVEL的父级PARENTID,

    如传入COMID‘21010101’ 获取对应COMLEVEL为‘3’的父级PARENTID,则返回2101

    如传入COMID‘21010101’ 获取对应COMLEVEL为‘2’的父级PARENTID,则返回21

    2、编写递归查询sql

    1. SELECT T2.PARENTID
    2. FROM (
    3. SELECT
    4. @r AS _comcode,
    5. (SELECT @r := PARENTID FROM test WHERE COMID = _comcode) AS PARENTID,
    6. @l := @l + 1 AS lvl
    7. FROM
    8. (SELECT @r := '21010101', @l := 0) vars,
    9. test h
    10. WHERE @r <> 0) T1
    11. JOIN test T2
    12. ON T1._comcode = T2.COMID where T2.COMLEVEL='3' ;

    查询结果如下:

     3、编写函数

    由于使用改递归sql的地方比较多,所以打算写个函数来实现

    1. CREATE DEFINER=`test`@`localhost` FUNCTION `getComcodeByLevel`(in_comcode varchar(50),comlevel varchar(50)) RETURNS varchar(100) CHARSET utf8mb3
    2. BEGIN
    3. declare v_comcode varchar(100);
    4. SELECT T2.PARENTID into v_comcode
    5. FROM (
    6. SELECT
    7. @r AS _comcode,
    8. (SELECT @r := PARENTID FROM test WHERE COMID = _comcode) AS PARENTID,
    9. @l := @l + 1 AS lvl
    10. FROM
    11. (SELECT @r := in_comcode, @l := 0) vars,
    12. test h
    13. WHERE @r <> 0) T1
    14. JOIN test T2
    15. ON T1._comcode = T2.COMID where T2.COMLEVEL=comlevel ;
    16. return v_comcode;
    17. END

    写好之后保存的时候遇到以下错误

    1418- This function has none of DETERMINISTIC, NO SQL or READS SQL DATA in its declaration and binary logging is enabled (you*might* want to use the less safe log_bin_trust_function_creators variable)

            log_bin_trust_function_creators 这个是MySQL的一个内置变量,系统需要信任生成函数才能创建,系统默认在binlog开启的时候是关闭生成函数的使用的。可以使用以下语句开启

    set global log_bin_trust_function_creators=1;

    可以使用以下命令查看开关状态,由于本地已经开启,所以是ON状态

    show variables like 'log_bin_trust_function_creators';

    4、测试

    输入参数如下:

     函数返回

    再次输入参数如下:

    函数返回:

     基本可以实现需求

    当然也可以使用 以下方式实现

    1. with recursive temp as (
    2. select * from sys_menu p  
    3. union all 
    4.  select t.* from sys_menu t inner join temp t2 on t2.id = t.parent_id 
    5. )
    6. select *  from temp 

  • 相关阅读:
    【Python datetime模块精讲】:时间旅行者的日志,精准操控日期与时间
    力扣:392.判断子序列
    论文笔记(二十二):GRiD: GPU-Accelerated Rigid Body Dynamics with Analytical Gradients
    微服务(服务治理)
    车险计算器微信小程序源码 带流量主功能
    java+python+vue学习资源共享网站
    [附源码]计算机毕业设计springboot基于vue+mysql开发的考试系统
    UER(腾讯)
    入门力扣自学笔记77 C++ (题目编号535)
    机器学习笔记 - 用于3D物体检测的KITTI数据集的使用及说明
  • 原文地址:https://blog.csdn.net/jungeCSND/article/details/126307651