首页 > 数据库 >mysql的递归写法:部门层级

mysql的递归写法:部门层级

时间:2023-05-06 14:04:26浏览次数:53  
标签:层级 sd1 sd2 recursion t1 递归 mysql id SELECT

前言

详细的可以参考:https://cloud.tencent.com/developer/article/2106748 这里用 WITH RECURSIVE 实现递归,需要MySQL 8.0 版本以上 示例里没有加逻辑删除字段的筛选,自己加上即可,例如 is_delete = 0 oracle的递归看我另一篇博文:

表结构

mysql的递归写法:部门层级_递归

数据

mysql的递归写法:部门层级_子节点_02

查询子节点

示例
WITH RECURSIVE recursion AS (
	SELECT
		sd1.* 
	FROM
		sys_dept sd1 
	WHERE
		sd1.id = '101' UNION ALL
	SELECT
		sd2.* 
	FROM
		sys_dept sd2,
		recursion t2 
	WHERE
		sd2.parent_id = t2.id 
	) SELECT
	t1.* 
FROM
	recursion t1;

或者

WITH RECURSIVE recursion ( id, NAME, parent_id ) AS (
	SELECT
		sd1.id,
		sd1.NAME,
		sd1.parent_id 
	FROM
		sys_dept sd1 
	WHERE
		sd1.id = '101' UNION ALL
	SELECT
		sd2.id,
		sd2.NAME,
		sd2.parent_id 
	FROM
		sys_dept sd2,
		recursion t2 
	WHERE
		sd2.parent_id = t2.id 
	) SELECT
	t1.id,
	t1.NAME,
	t1.parent_id 
FROM
	recursion t1;
结果

mysql的递归写法:部门层级_子节点_03

不含自己的写法

加个不等于即可

mysql的递归写法:部门层级_子节点_04

查询父节点

示例
WITH RECURSIVE recursion AS (
	SELECT
		sd1.* 
	FROM
		sys_dept sd1 
	WHERE
		sd1.id = '103' UNION ALL
	SELECT
		sd2.* 
	FROM
		sys_dept sd2,
		recursion t2 
	WHERE
		sd2.id = t2.parent_id 
	) SELECT
	t1.* 
FROM
	recursion t1;
结果

mysql的递归写法:部门层级_递归_05

不含自己的写法

加个不等于即可

mysql的递归写法:部门层级_递归_06

查询子节点和父节点的区别

其实就是将 parent_idid 换换位置而已

mysql的递归写法:部门层级_子节点_07

多行合并一行

就是我输入部门ID,然后获取到他的所有的父级的部门名称,拼接成一个字符串

示例
WITH RECURSIVE recursion AS (
	SELECT
		sd1.* 
	FROM
		sys_dept sd1 
	WHERE
		sd1.id = '103' UNION ALL
	SELECT
		sd2.* 
	FROM
		sys_dept sd2,
		recursion t2 
	WHERE
		sd2.id = t2.parent_id 
	) SELECT
	group_concat( t1.`name` ORDER BY t1.`level` ASC SEPARATOR '#' ) AS nameList 
FROM
	recursion t1;
结果

mysql的递归写法:部门层级_父节点_08

标签:层级,sd1,sd2,recursion,t1,递归,mysql,id,SELECT
From: https://blog.51cto.com/u_16085431/6249592

相关文章

  • 从建模思路看 MySQL 和 TDengine 哪个更适合处理量化交易场景下的海量时序数据
    在“量化投资分析”场景中,系统需要从数据接口、网络上等各个地方获取证券的信息,其中往往以“实时的价格变动信息”为主要数据,然后再对这些数据进行实时的分析与存储,供盘中和盘后使用。某企业遇到的问题如下:“我们要对500个证券品种进行监控,在开盘时,每5秒会更新一次价格数据。这......
  • MySQL5.7 访问Information_schema.TABLES 导至内存持续增长
    在生产环境5.7.30的数据库中,部署了MYSQL监控,但是发现部署完监控后,mysqld的内存持续增长。后通过监控发现也正是监控用户占用了大量的内存。目录适用范围问题概述问题原因解决方案参考文档适用范围mysql5.7问题概述在生产环境5.7.30的数据库中,部署了MYSQL监......
  • MySQL学习之——锁(行锁、表锁、页锁、乐观锁、悲观锁等)
    锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具。在计算机中,是协调多个进程或县城并发访问某一资源的一种机制。在数据库当中,除了传统的计算资源(CPU、RAM、I/O等等)的争用之外,数据也是一种供许多用户共享访问的资源。如何保证数据并发访问的一致性、有效性,是所有数据库必须......
  • MySQL为什么使用可重复读隔离级别?
    历史原因:早期MySQL的binlog日志只有statement格式,在读已提交的隔离界别下,binlog日志存在bug,会导致主从复制不一致的情况。因此默认的隔离级别使用可重复读。bug:binlog日志中记录的语句顺序和原有顺序会不一致。先删除后插入的操作,同步导从库就变成了先插入后删除的操作了。MySQL......
  • 由浅入深学MYSQL之--MySQL分组查询详解
    前言从今天开始本系列文内容就带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深,全面讲解数据库体系。非常适合零基础的小伙伴来学习。全文大约【1066】字,不说废话,只讲可以让你学到技术、明白原理的纯......
  • MySQL执行计划
    explain查看执行计划在MySQL中如何知道一条sql到底有没有用到索引呢?MySQL提供了explain关键字来查询一条sql的执行效率。比如我们有一张user表:CREATETABLE`user`(`id`int(11)NOTNULLAUTO_INCREMENT,`userId`int(11)NOTNULL,`age`int(11)......
  • docker mysql error 1045 using password:yes
     错误截图  解决办法 找到mysql配置文件my.cnf 没有映射的话需要进入到MySQL的容器中找到/etc/下my.cnf文件在my.cnf中[mysqld]下添加skip-grant-tables容器里不能直接修改文件,需要安装相应的vim。下面通过dockercp拷贝文件进行修改#将容器中的文件拷贝......
  • MySQL----索引的创建、删除和查看
    1.索引作用  在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率。特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍。  例如,有3个未索引的表t1、t2、t3,分别只包含列c1、c2、c3,每个表分别含有1000行数据......
  • MySQL----数据库的安装、创建
    一、MySQL的安装。。。。。 二、MySQL实例的创建注意:停掉MySQL的服务(我的电脑---管理---服务) 如果实例一次创建不成功,第二次创建时会遇到如下错误:mysql安装出现errorNr.1045我们在windows下安装mysql时会出现Accessdeniedforuser'root'@localhost'(usingpassword:No)的问......
  • 回溯法 求幂集 (递归+非递归)
    /*回溯法--求幂集(递归+非递归)*/#include<cstdio>constintN=100;intn=3;////集合中元素个数intstate[N];//递归要用,0:不选,1:选,2:未确定intop[N];//非递归要用,0:不选,1:选,2:未确定/*输出数组中的数字*/voidprint_arr(intarr[],intn){fo......