TensorRT Hibernate junit jackson Component idea大小写转换快捷键 bootstrap文件上传样式 map删除指定元素 mysql合并结果集 a标签去除下划线 hash怎么下载 java获取字符串 svn查看历史版本 mysql时间戳转日期 kubernetes视频 python安装教程 python中的index python抛出异常 python环境变量配置 java正则匹配 java8特性 java多态 java语言代码大全 java课程学习 java安装教程 java格式化字符串 java时间转时间戳 网页游戏代码 java电子书下载 灼热峡谷 摩斯电码翻译器 苹果手机老是自动重启 选项卡 苹果手机验机软件 mtu设置多少最好 骰子牛牛怎么玩 fireworks 幽灵推 jquery添加样式 任务栏跑到右侧怎么办
当前位置: 首页 > 学习教程  > 编程语言

关于项目中-----多级目录/菜单接口的写法(第一章SQL篇)

2020/12/28 19:46:12 文章标签:

多级目录/菜单接口的写法(第一章SQL篇) 例如: 再一般项目中或多或少都会遇到这种多级菜单的需求,于此我稍微总结了一种写法 基于springboot来构建的技术栈,测试工具用的swagger2 目录结构 首先看到TestMapper.xml …

多级目录/菜单接口的写法(第一章SQL篇)

例如:
在这里插入图片描述

再一般项目中或多或少都会遇到这种多级菜单的需求,于此我稍微总结了一种写法
基于springboot来构建的技术栈,测试工具用的swagger2

目录结构

在这里插入图片描述

  1. 首先看到TestMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bobo.cd2006swagger.Dao.mapper.TestMapper">
    <resultMap id="test" type="com.bobo.cd2006swagger.pojo.Test">
        <id property="id" column="id"></id>
        <result property="name" column="name"></result>
        <result property="parent_id" column="parent_id"></result>
    </resultMap>
    <select id="findAllTestData" resultMap="test" parameterType="int">
        SELECT t3.id,t3.name,t3.parent_id
        FROM
        (SELECT t1.*,t2.*,
          IF(FIND_IN_SET(t1.parent_id, @pid) > 0, @pid := CONCAT(@pid, ',', t1.id), 0) AS isChild
        FROM test AS t1 ,
        (SELECT @pid := #{id}) AS t2) AS t3
        WHERE t3.isChild != 0
        UNION
        SELECT * FROM test WHERE id = @pid
    </select>
</mapper>
  1. 这里的SQL语句使用了递归,查询了所有本类和子类的所有数据出来
    测试数据表是这样的:
    在这里插入图片描述
    构成多级目录结构通过一张表实现。
#递归查询父节点下的所有子节点 包括自己
SELECT * FROM test WHERE id = @pid
UNION 
SELECT t3.id,t3.name,t3.parent_id
FROM
(SELECT t1.*,t2.*,
IF(FIND_IN_SET(t1.parent_id, @pid) > 0, @pid := CONCAT(@pid, ',', t1.id), 0) AS isChild
FROM test AS t1 ,
(SELECT @pid := 1) AS t2) AS t3
WHERE t3.isChild != 0

SQL语句查询结果为:
在这里插入图片描述
这里将所有广东省一级目录下的子类全部查询出来了,相信有一部分人看到这里感觉到懵懵的。

我们来解析一下这个SQL语句
首先:

#1. @pid 全局变量
SELECT t1.*,t2.*
FROM test AS t1 , 
(SELECT @pid := 1) AS t2

查询结果为
在这里插入图片描述
然后:

#2.   IF(x,y,z)相当于三目运算符 
#     FIND_IN_SET()函数:如果t1.parent_id被包含在@pid中时
#     则这样子显示@pid := CONCAT(@pid, ',', t1.id)否则显示0
SELECT t1.*,t2.*,
IF(FIND_IN_SET(t1.parent_id, @pid) > 0, @pid := CONCAT(@pid, ',', t1.id), 0) AS isChild
FROM test AS t1 ,
(SELECT @pid := 1) AS t2

查询结果为:递归查询出和id=1相关的数据
在这里插入图片描述
再然后:

#3.查询父ID下的所有子ID不包括父类
SELECT t3.id,t3.name,t3.parent_id
FROM
(SELECT t1.*,t2.*,
IF(FIND_IN_SET(t1.parent_id, @pid) > 0, @pid := CONCAT(@pid, ',', t1.id), 0) AS isChild
FROM test AS t1 ,
(SELECT @pid := 1) AS t2) AS t3
WHERE t3.isChild != 0

查询结果为:将上边的数据当成一张表 在次查询 id=1 下的所有子类
在这里插入图片描述
最后把父类添加进去:

SELECT * FROM test WHERE id = @pid
UNION 
SELECT t3.id,t3.name,t3.parent_id
FROM
(SELECT t1.*,t2.*,
IF(FIND_IN_SET(t1.parent_id, @pid) > 0, @pid := CONCAT(@pid, ',', t1.id), 0) AS isChild
FROM test AS t1 ,
(SELECT @pid := 1) AS t2) AS t3
WHERE t3.isChild != 0

查询结果:
在这里插入图片描述
总体思路就是通过递归并且判断所有与id=1有关的行做上标记,然后取出想要的值。
这里的@pid=X ,X就是你要查询的一级目录ID。


本文链接: http://www.dtmao.cc/news_show_550373.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?