• 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 

  • 相关阅读:
    vscode debug with cmake on macos
    Docker笔记-10 Swarm mode
    [SDR] GNU Radio 系列教程(十五)—— GNU Radio GFSK 模块
    面试总结-2023届安全面试题总汇
    <HarmonyOS第一课>应用程序框架——闯关习题及答案
    力扣 -- 322. 零钱兑换(完全背包问题)
    Vue项目搭建及使用vue-cli创建项目、创建登录页面、与后台进行交互,以及安装和使用axios、qs和vue-axios
    Web网上订购系统开题报告详解
    JavaScript相关面试题5
    Node.js 入门教程 14 使用 exports 从 Node.js 文件中公开功能
  • 原文地址:https://blog.csdn.net/jungeCSND/article/details/126307651