MySQL子句中可以无限嵌套吗,是否有递归问题-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

MySQL子句中可以无限嵌套吗,是否有递归问题

睡着了去做梦 2021-10-14 10:29:34 37

MySQL子句中可以无限嵌套吗,是否有递归问题

云服务器登录 云服务器设置
分享到
取消 提交回答
全部回答(1)
  • XiaozhouTAT
    2021-10-14 10:56:41

    mysql本身不支持递归语法,但可通过自连接变相实现一些简单的递归

    --递归小方法:临时表和普通表的不同方法

    --这题使用的是2次临时表查询父节点的递归

    drop table if exists test;

    create table test(

    id varchar(100),

    name varchar(20),

    parentid varchar(100)

    );

    insert test select

    '13ed38f1-3c24-dd81-492f-673686dff0f3', '大学教师', '37e2ea0a-1c31-3412-455a-5e60b8395f7d' union all select

    '1ce203ac-ee34-b902-6c10-c806f0f52876','小学教师', '37e2ea0a-1c31-3412-455a-5e60b8395f7d' union all select

    '37e2ea0a-1c31-3412-455a-5e60b8395f7d', '教师' , null union all select

    'c877b7ea-4ed3-f472-9527-53e1618cb1dc', '高数老师', '13ed38f1-3c24-dd81-492f-673686dff0f3' union all select

    'ce50a471-2955-00fa-2fb7-198f6b45b1bd', '中学教师', '37e2ea0a-1c31-3412-455a-5e60b8395f7d';

    delimiter $$

    create procedure usp_ser(in idd varchar(100))

    begin

    declare lev int;

    set lev=1;

    drop table if exists tmp1;

    drop table if exists tmp2;

    CREATE TEMPORARY TABLE tmp1(id varchar(100),name varchar(20),parentid varchar(100),levv int);

    CREATE TEMPORARY TABLE tmp2(pid varchar(100));

    insert tmp2 select parentid from test where id=idd;

    insert tmp1 select t.* , lev from test t join tmp2 a on t.id=a.pid;

    while exists(select 1 from tmp2 )

    do

    truncate tmp2;

    set lev=lev+1;

    insert tmp2 select t.id from test t join tmp1 a on t.id=a.parentid and a.levv=lev-1;

    insert tmp1 select t.*,lev from test t join tmp2 a on t.id=a.pid;

    end while ;

    select id,name,parentid from tmp1;

    end;

    $$

    delimiter ;

    call usp_ser('c877b7ea-4ed3-f472-9527-53e1618cb1dc');

    +--------------------------------------+----------+--------------------------------------+

    | id | name | parentid |

    +--------------------------------------+----------+--------------------------------------+

    | 13ed38f1-3c24-dd81-492f-673686dff0f3 | 大学教师 | 37e2ea0a-1c31-3412-455a-5e60b8395f7d |

    | 37e2ea0a-1c31-3412-455a-5e60b8395f7d | 教师 | NULL |

    +--------------------------------------+----------+--------------------------------------+

    call usp_ser('13ed38f1-3c24-dd81-492f-673686dff0f3');

    +--------------------------------------+------+----------+

    | id | name | parentid |

    +--------------------------------------+------+----------+

    | 37e2ea0a-1c31-3412-455a-5e60b8395f7d | 教师 | NULL |

    +--------------------------------------+------+----------+

    call usp_ser('37e2ea0a-1c31-3412-455a-5e60b8395f7d');

    Empty set (0.02 sec)

    上面的方法因为由于MySQL中不允许在同一语句中对临时表多次引用,所以用2次临时表

    下面给个一次性用普通表完成的 查询子节点的递归查询

    核心代码

    drop table if exists test;

    create table test(

    id INT,

    parentid INT

    );

    insert test select

    1, 0 UNION ALL SELECT

    2, 1 UNION ALL SELECT

    3, 1 UNION ALL SELECT

    4, 0 UNION ALL SELECT

    5, 2 UNION ALL SELECT

    6, 5 UNION ALL SELECT

    7, 3 ;

    Go

    delimiter $$

    create procedure usp_ser(in idd varchar(100))

    begin

    declare lev int;

    set lev=1;

    drop table if exists tmp1;

    CREATE TABLE tmp1(id INT,parentid INT ,levv INT,ppath VARCHAR(1000));

    INSERT tmp1 SELECT *,lev,id FROM test WHERE parentid=idd;

    while row_count()>0

    do

    set lev=lev+1;

    insert tmp1 select t.*,lev,concat(a.ppath,t.id) from test t join tmp1 a on t.parentid=a.id AND levv=LEV-1;

    end while ;

    SELECT * FROM tmp1;

    end;

    $$

    delimiter ;

    call usp_ser(0);

    /*

    +------+----------+------+-------+

    | id | parentid | levv | ppath |

    +------+----------+------+-------+

    | 1 | 0 | 1 | 1 |

    | 4 | 0 | 1 | 4 |

    | 2 | 1 | 2 | 12 |

    | 3 | 1 | 2 | 13 |

    | 5 | 2 | 3 | 125 |

    | 7 | 3 | 3 | 137 |

    | 6 | 5 | 4 | 1256 |

    +------+----------+------+-------+*/

    您可能感兴趣的文章:MySQL递归查询树状表的子节点、父节点具体实现

    SQL如何实现MYSQL的递归查询

    php+mysql不用递归实现的无限级分类实例(非递归)

    使用递归删除树形结构的所有子节点(java和mysql实现)

    使用函数递归实现基于php和MySQL的动态树型菜单

    利用java+mysql递归实现拼接树形JSON列表的方法示例

    PHP递归写入MySQL实现无限级分类数据操作示例

    Mysql树形递归查询的实现方法

    相关资源:两种mysql递归tree查询效率-mysql递归tree_mysql递归查询树,mysql... 打开CSDN,阅读体验更佳

    MySQL之递归小问题 mysql本身不支持递归语法,但可通过自连接变相实现一些简单的递归 --递归小方法:临时表和普通表的不同方法 --这题使用的是2次临时表查询父节点的递归 drop table if exists test; create table test( id varchar... mysql递归问题 有个小坑: 在创建function时 , 名字写错了,这里应该是getPartList, 导致下面的sql运行不了, 这个小问题不注意还纠结了一下怎么回事。 ---下面是原文:转至 云栖社区 最近遇到了一个问题,在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询?... 浏览器打开 相关推荐更多相似内容 mysql递归自身连接_MySQL之递归小问题案例分享_Ake阿科... mysql本身不支持递归语法,但可通过自连接变相实现一些简单的递归,本文主要介绍了MySQL之递归小问题,需要的朋友可以参考下,希望能帮助到大家。 --递归小方法:临时表和普通表的不同方法 --这题使用的是2次临时表查询父节点的递归... mysql 简单递归_MySQL之递归小问题_冠诚的博客 mysql 简单递归_MySQL之递归小问题 mysql本身不支持递归语法,但可通过自连接变相实现一些简单的递归 --递归小方法:临时表和普通表的不同方法 --这题使用的是2次临时表查询父节点的递归 drop table if exists test;... MySQL递归的替代方案   类似查出某个机构下所有的子机构,可用递归的方式实现。但MySQL不支持递归,可以考虑用如下的方式来实现递归调用。 第一种,临时表方式,使用函数每次查出子机构,再可以和其他表联查。 第二种,新建一张表,列举出机构和子机构的关系,适合于机构数量不多的情况。 第三种,较为通用的情况。使用hierarchy,例如部级机构01,02...,省级机构01-01,0... 浏览器打开 mysql 支持递归函数吗_MySQL不支持递归函数?为什么?从何时起? 最新发布 没问题,Jenco.不如PostgreSQL函数效率高,但在MySQL程序中也可以:DELIMITER DROPPROCEDUREIFEXISTStest.factorialproc CREATE PROCEDURE test.factorial_proc(IN n BIGINT,OUT res BIGINT)BEGINSET max_sp_recursion_depth=10... 浏览器打开 mysql递归查询方法|mysql递归查询遇到的坑,教你们解决... 1.前言大家在用mysql递归查询的时候,肯定或多或少的会碰到一些问题,像小编就遇到了天大的坑(如下图),于是自己踩了坑,我得想办法把它铺一铺吖,避免大家也同时遇到这样的问题。让技术人能够快速的解决问题。遇到问题如图: 相信很多人... [MySQL之递归小问题]_飞轩亭 [MySQL之递归小问题] 原帖地址:http://topic.csdn.net/u/20100814/02/6194eb47-4bd2-4160-b4ec-6b55aebf2160.html?seed=1538454170&r=67702050#r_67702050 --递归小方法:临时表和普通表的不同方法... 两种mysql递归tree查询效率-mysql递归tree 两种mysql递归tree查询效率-mysql递归tree,提供两种递归算法 SQL如何实现MYSQL的递归查询 主要介绍了根据递归到迭代转化的思路,利用SQL实现了MYSQL的递归查询,需要的朋友可以参考下 mysql递归查询解决方案_递归实践问题与解决方案_cumtb2... mysql递归查询解决方案Recursion practice problems: Here, you will find the various recursion practice problems with solutions that are commonly asked in the various interview rounds of the companies. Each recu... mysql 递归 性能_漫谈递归:递归的效率问题_尚伊露的博客 mysql 递归 性能_漫谈递归:递归的效率问题 递归在解决某些问题的时候使得我们思考的方式得以简化,代码也更加精炼,容易阅读。那么既然递归有这么多的优点,我们是不是什么问题都要用递归来解决呢?难道递归就没有缺点吗?今天我们就来讨论一... Mysql树形递归查询的实现方法 对于数据库中的树形结构数据,如部门表,有时候,我们需要知道某部门的所有下属部分或者某部分的所有上级部门,这时候就需要用到mysql的递归查询 最近在做项目迁移,Oracle版本的迁到Mysql版本,遇到有些oracle的... MySQL实现递归查询的三种方式.rar MySQL递归查询 三种实现方式,方式一:使用自定义函数实现,方式二:纯SQL实现,方式三:适用于MySQL8及以上使用 WITH RECURSIVE实现 mysql递归查询之后的排序问题_MySQL递归排序查询+树节... mysql 递归排序查询 备注:producttype 排序表,producttype。ptype父节点 ,producttype 。id 主键,showTreeNodes (IN rooti mysql 递归排序查询 备注:producttype 排序表,producttype。ptype父节点 ,producttype 。id 主键,showTreeNode... MySQL的存储过程不支持递归 [code="java"] -- FUNCTION check_asset_group_mirror_relationship DROP FUNCTION IF EXISTS check_asset_group_mirror_relationship; DELIMITER | CREATE FUNCTION check_asset_group_mirror_relationship(g... 浏览器打开 MySQL通过自定义函数实现递归查询父级ID或者子级ID 主要介绍了MySQL通过自定义函数实现递归查询父级ID或者子级ID

    1 0
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

相似问题
最新问题
推荐课程