背景                                                                                                      

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

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

准备                                                                                                        

创建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. Docker安装(一)

    环境:CentOS release 6.9 (Final)   1.检查环境是否支持安装docker 1)系统内核是否是3.8或更高版本 uname -a (这个安装不了,内核版本不够) Linux ...

  2. TreeSet的两种排序方式,含Comparable、Comparator

    1.排序的引入 由于TreeSet可以实现对元素按照某种规则进行排序,例如下面的例子 public class TreeSetDemo { public static void main(String ...

  3. win7中安装mysql

    这篇文章主要介绍了如何在win7中安装mysql,所以加上了MySQL的下载过程,希望对需要的人有所帮助大家都知道MySQL是一款中.小型关系型数据库管理系统,很具有实用性,对于我们学习很多技术都有帮 ...

  4. SQL 第一范式、第二范式、第三范式、BCNF范式

    一.第一范式 1NF 要求:每一个分量必须是不可分的数据项. 特点: 1)有主键,且主键不能为空. 2)字段不能再分. 示例:(以下例子 不满足 第一范式) /*学号      年龄        信 ...

  5. python成功之道

    https://blog.ansheng.me/article/python-full-stack-way

  6. EasyMock 模拟对象测试

    一.EasyMock 使用动态代理实现模拟对象创建,一般可以满足以下测试需求 1.要测试的模块依赖于其它自己控制不了的模块,如第三方服务,其它组员在开发的服务等,它们都没办法配合你来测试: 2.涉及到 ...

  7. Pymysql部分

    安装: 1 执行SQL import pymysql # 创建连接 conn = pymysql.connect(host='172.30.2.233', port=3306, user='root' ...

  8. bootstrap的日期选择器

    时间框偏移解决办法 首先导入js和css文件 <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js" ...

  9. Python + Robot Framework 环境搭建

    一.Python 安装 说明:由于RIDE是基于python2.x开发,后期未做python3.x兼容,所以这里安装python2.7. 链接: https://pan.baidu.com/s/1yf ...

  10. 四张图带你了解Tomcat系统架构

    一.Tomcat顶层架构 先上一张Tomcat的顶层结构图(图A),如下: Tomcat中最顶层的容器是Server,代表着整个服务器,从上图中可以看出,一个Server可以包含至少一个Service ...