zoukankan      html  css  js  c++  java
  • mysql 递归查找菜单节点的所有子节点

    背景                                                                                                      

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

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

    准备                                                                                                        

    创建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 '1' COMMENT '菜单状态 1-有效;0-无效',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=12212 DEFAULT CHARSET=utf8;

    插入数据:

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

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

    查询                                                                                                           

     先贴出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

  • 相关阅读:
    Dynamics AX 2012 R2 配置E-Mail模板
    Dynamics AX 2012 R2 设置E-Mail
    Dynamics AX 2012 R2 为运行失败的批处理任务设置预警
    Dynamics AX 2012 R2 耗尽用户
    Dynamics AX 2012 R2 创建一个专用的批处理服务器
    Dynamics AX 2012 R2 创建一个带有负载均衡的服务器集群
    Dynamics AX 2012 R2 安装额外的AOS
    Dynamics AX 2012 R2 将系统用户账号连接到工作人员记录
    Dynamics AX 2012 R2 从代码中调用SSRS Report
    Dynamics AX 2012 R2 IIS WebSite Unauthorized 401
  • 原文地址:https://www.cnblogs.com/zhaoyan001/p/11446484.html
Copyright © 2011-2022 走看看