背景                                                                                                      

项目中遇到一个需求,要求查处菜单节点的所有节点,在网上查了一下,大多数的方法用到了存储过程,由于线上环境不能随便添加存储过程,

因此在这里采用类似递归的方法对菜单的所有子节点进行查询。

准备                                                                                                        

创建menu表:

CREATE TABLE `menu` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜单id',
`parent_id` int(11) DEFAULT NULL COMMENT '父节点id',
`menu_name` varchar(128) DEFAULT NULL COMMENT '菜单名称',
`menu_url` varchar(128) DEFAULT '' COMMENT '菜单路径',
`status` tinyint(3) DEFAULT '' COMMENT '菜单状态 1-有效;0-无效',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12212 DEFAULT CHARSET=utf8;

插入数据:

INSERT INTO `menu` VALUES ('', null, '菜单0', ' ', '');
INSERT INTO `menu` VALUES ('', '', '菜单1', '', '');
INSERT INTO `menu` VALUES ('', '', '菜单11', '', '');
INSERT INTO `menu` VALUES ('', '', '菜单12', '', '');
INSERT INTO `menu` VALUES ('', '', '菜单13', '', '');
INSERT INTO `menu` VALUES ('', '', '菜单111', '', '');
INSERT INTO `menu` VALUES ('', '', '菜单121', '', '');
INSERT INTO `menu` VALUES ('', '', '菜单122', '', '');
INSERT INTO `menu` VALUES ('', '', '菜单1221', '', '');
INSERT INTO `menu` VALUES ('', '', '菜单1222', '', '');
INSERT INTO `menu` VALUES ('', '', '菜单12211', '', '');

得到的目录结构如下图所示:

查询                                                                                                           

先贴出sql语句:

select id from (
select t1.id,
if(find_in_set(parent_id, @pids) > 0, @pids := concat(@pids, ',', id), 0) as ischild
from (
select id,parent_id from re_menu t where t.status = 1 order by parent_id, id
) t1,
(select @pids := 要查询的菜单节点 id) t2
) t3 where ischild != 0

比如,要查询菜单节点12的所有子节点,则查处的结果为:

 分析                                                                                                            

首先分析from后面的语句,根据parent_id和id 排序,并将要查询的菜单节点当做变量,from后面的结果为

接下来看if(express1,express2,express3)条件语句,if语句类似三目运算符,当exprss1成立时,执行express2,否则执行express3;

FIND_IN_SET(str,strlist),str 要查询的字符串,strlist 字段名 参数以”,”分隔 如 (1,2,6,8),查询字段(strlist)中包含(str)的结果,返回结果为null或记录

如果parent_id 在@pid中,则将@pid 里面再加上parent_id,按行依次执行,执行过程如下表所示:

这时,显示的id就是菜单id为12的所有子节点id

mysql 递归查找菜单节点的所有子节点的更多相关文章

  1. [SQL]T-Sql 递归查询(给定节点查所有父节点、所有子节点的方法)

    T-Sql 递归查询(给定节点查所有父节点.所有子节点的方法)   -- 查找所有父节点with tab as( select Type_Id,ParentId,Type_Name from Sys_ ...

  2. jQuery 判断父节点下是否有子节点

    查找父节点下是否有子节点有两个情况:(1)查找的是父元素的所有后代节点:(2)仅查找父元素的第一代子节点. <div id="app"> <div> < ...

  3. bootstrap-treeview 如何实现全选父节点下所有子节点及反选

    转(https://www.augsky.com/992.html) 选中父节点时,父节点下所有子节点也都全部选中 1,HTML代码 <h2>TreeView Checkable</ ...

  4. T-Sql 递归查询(给定节点查所有父节点、所有子节点的方法)

    -- 查找所有父节点with tab as( select Type_Id,ParentId,Type_Name from Sys_ParamType_V2_0 where Type_Id=316-- ...

  5. mysql 递归查找所有子节点

    select dept_id from ( select t1.dept_id,t1.parent_id, if(find_in_set(parent_id, @pids) > 0, @pids ...

  6. MySql获取树型结构的所有子节点

    stackoverflow的解决方案,亲测有效: SELECT * FROM person WHERE department IN (SELECT department_id FROM departm ...

  7. element-ui default-checked-keys 会把节点下所有子节点全部勾选解决方法

    <el-tree class="filter-tree" :data="permissionData" :props="props" ...

  8. SQL Server 查询树结构的表,查询一个节点的所有子节点

    ;with cte as ( select * from Associator where No = 'mc1007' union all select air.* from Associator a ...

  9. SQL根据某一父节点查询所有子节点,无限

    ;with cte as( select id,ParentCategoryId from Category where id = 17 union all select a.id,a.ParentC ...

随机推荐

  1. 20165308实验三 敏捷开发与XP实践实验报告

    实验三 敏捷开发与XP实践实验报告 实验目的 安装 alibaba 插件,解决代码中的规范问题.再研究一下Code菜单,找出一项让自己感觉最好用的功能. 在码云上把自己的学习搭档加入自己的项目中,确认 ...

  2. Nginx反向代理tomcat返回400 bad request

    Nginx反向代理tomcat返回400 bad request nginx 版本1.12, tomcat版本 9.06 最近用Nginx做反向代理tomcat,实现前后端分离,nginx 将请求代理 ...

  3. Maven项目构建过程练习

    转载于:http://www.cnblogs.com/xdp-gacl/p/4051690.html 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建 ...

  4. forward reference前向引用,gloal values and local values全局变量和局部变量,recursive function递归函数

    1.全局变量与局部变量练习 1 # -*- coding: UTF-8 -*- 2 def bar(): 3 print('from bar') 4 def foo(): 5 print('from ...

  5. Web GIS系统相关

    最近研究了百度 echarts 的一个很炫酷的示例: http://gallery.echartsjs.com/editor.html?c=xrJHCfsfE- 看了代码发现了很多不懂1东西,研究研究 ...

  6. 第一个Eureka程序,Eureka Client的自启动原理和简要过程

    https://blog.csdn.net/u011531425/article/details/81675289 在之前的Spring Cloud Config的基础上,搭建简单的Eureka Se ...

  7. 自己动手实现JDK动态代理

    出自:作者:孤独烟  http://rjzheng.cnblogs.com/ ------------------------------------------------------------- ...

  8. gentoo 建立本地软件库并安装软件 Custom repository

    参考 Handbook:AMD64/Portage/CustomTree https://wiki.gentoo.org/wiki/Handbook:AMD64/Portage/CustomTree# ...

  9. redis的缓冲击穿|缓冲雪崩|缓冲淘汰

    Redis 的缓存穿透和击穿 查询数据 缓存中有,从缓存中返回 缓存中没有,从数据库中查找,数据库中命中结果 ,将查询到的数据保存到缓存中 缓存中没有,从数据库中查找,数据库中也没有 , 不在缓存中保 ...

  10. JDK1.7 高并发下的HashMap

    HashMap的容量是有限的.当经过多次元素插入,使得HashMap达到一定饱和度时,Key映射位置发生冲突的几率会逐渐提高. 这时候,HashMap需要扩展它的长度,也就是进行Resize. 影响发 ...