全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

MySQL之递归小问题

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  # 递归  # MySQL递归查询树状表的子节点、父节点具体实现  # SQL如何实现MYSQL的递归查询  # php+mysql不用递归实现的无限级分类实例(非递归)  # 使用递归删除树形结构的所有子节点(java和mysql实现)  # 使用函数递归实现基于php和MySQL的动态树型菜单  # 利用java+mysql递归实现拼接树形JSON列表的方法示例  # PHP递归写入MySQL实现无限级分类数据操作示例  # Mysql树形递归查询的实现方法  # 的是  # 不支持  # 可通过  # 中对  # 给个  # 中不  # 中学教师  # 高数  # 在同一  # union  # e60b8395f7d  # ce203ac  # e2ea0a  # null  # c877b7ea  # exists  # table  # test  # id 


相关文章: 哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  如何在阿里云通过域名搭建网站?  如何获取上海专业网站定制建站电话?  c# 在高并发场景下,委托和接口调用的性能对比  历史网站制作软件,华为如何找回被删除的网站?  如何在服务器上三步完成建站并提升流量?  ,石家庄四十八中学官网?  宝华建站服务条款解析:五站合一功能与SEO优化设置指南  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何获取免费开源的自助建站系统源码?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  如何高效搭建专业期货交易平台网站?  制作网站的基本流程,设计网站的软件是什么?  如何高效生成建站之星成品网站源码?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  网站制作免费,什么网站能看正片电影?  建站之星伪静态规则如何设置?  建站主机与虚拟主机有何区别?如何选择最优方案?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  如何通过商城免费建站系统源码自定义网站主题?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  如何访问已购建站主机并解决登录问题?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  建站之星如何助力网站排名飙升?揭秘高效技巧  公司网站制作需要多少钱,找人做公司网站需要多少钱?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  建站之星后台管理:高效配置与模板优化提升用户体验  ppt制作免费网站有哪些,ppt模板免费下载网站?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  如何高效利用200m空间完成建站?  广州商城建站系统开发成本与周期如何控制?  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  SQL查询语句优化的实用方法总结  如何撰写建站申请书?关键要点有哪些?  内部网站制作流程,如何建立公司内部网站?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  建站之星上传入口如何快速找到?  如何在万网主机上快速搭建网站?  网站设计制作企业有哪些,抖音官网主页怎么设置?  南宁网站建设制作定制,南宁网站建设可以定制吗?  如何快速完成中国万网建站详细流程?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  如何挑选优质建站一级代理提升网站排名?  如何快速查询网站的真实建站时间?  建站之星与建站宝盒如何选择最佳方案?  购物网站制作公司有哪些,哪个购物网站比较好?  香港服务器网站推广:SEO优化与外贸独立站搭建策略 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。