首页 > 数据库 >mysql 递归查询父级下的所有子级

mysql 递归查询父级下的所有子级

时间:2023-06-05 10:14:01浏览次数:39  
标签:name parent 父级 组织 cte 子级 mysql organization id

有一张组织表,该表有上下层级,使用mysql 递归查询某个组织下的所有子组织,sql要怎么写?

假设这张表名为 organization 的表,其结构如下:

CREATE TABLE organization (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  parent_id INT
);

表里插入了几条数据

INSERT INTO `organization` (`id`, `name`, `parent_id`) VALUES (1, '一级组织', NULL);
INSERT INTO `organization` (`id`, `name`, `parent_id`) VALUES (2, '二级组织1', 1);
INSERT INTO `organization` (`id`, `name`, `parent_id`) VALUES (3, '二级组织2', 1);
INSERT INTO `organization` (`id`, `name`, `parent_id`) VALUES (4, '三级组织1', 2);
INSERT INTO `organization` (`id`, `name`, `parent_id`) VALUES (5, '三级组织2', 2);
INSERT INTO `organization` (`id`, `name`, `parent_id`) VALUES (6, '三级组织3', 3);

在 MySQL 中,可以使用 WITH RECURSIVE 语句来实现递归查询

其中,id 表示组织的唯一标识符,name 表示组织名称,parent_id 表示父组织的唯一标识符,如果该组织是最高级别组织,则 parent_id 值为 NULL。

现在要查询某个组织下的所有子组织,可以使用以下 SQL 语句:


WITH RECURSIVE cte (id, name, parent_id) AS (
  SELECT id, name, parent_id FROM organization WHERE id = <指定组织的id>
  UNION ALL
  SELECT o.id, o.name, o.parent_id FROM organization o
  INNER JOIN cte ON o.parent_id = cte.id
)
SELECT id, name, parent_id FROM cte;

其中,<指定组织的id> 需要替换成实际的组织标识符。

上述 SQL 语句中的 WITH 子句定义了一个公共表达式(Common Table Expression,CTE)cte,用于存储递归查询中产生的结果集。首先,从 organization 表中选取指定组织,作为递归查询的起点。然后,使用 UNION ALL 操作符将该组织与其子组织连接起来,并将结果递归插入到 cte 表中,直到不再产生新的子组织为止。最后,通过 SELECT 语句从 cte 表中选取所有子组织的信息。

这样,mysql 递归查询就写好了,就能够得到指定组织下的所有子组织的信息。

标签:name,parent,父级,组织,cte,子级,mysql,organization,id
From: https://www.cnblogs.com/shamo89/p/17457089.html

相关文章

  • MySQL学习从基础开始
    1.什么是数据库DataBase,简称DB;数据库软件称为数据库管理系统,英文简称DBMS,全称为DataBaseManagementSystem,例如:Oracle、MySQL、SQLServer、Sybase、informix、DB2等等。2.MySQL概述MySQL最初是由“MySQLAB公司”开发的一套关系型数据库管理系统(RDBMS-RelationDataBas......
  • mysql备忘录
    MySQL8下载安装腾讯云Ubuntu20.04服务器下载MySQL8并开启远程服务下载sudoaptupdate#更新Ubuntu存储库sudoaptinstallmysql-server#下载mysqlsudosystemctlstatusmysql#查看mysql状态配置启动找到mysqld文件路径find/-namemysql.server或find/-namemy......
  • Mysql数据备份
    导出库/表导出库:mysqldump-h主机-u用户-p密码数据库>目标路径导出表:mysqldump-h主机-u用户-p密码数据库表1表2表3...>目标路径例如:mysqldump-hlocalhost-uroot-p123456schoolt_studentt_grade>D:/sql/1.sql导入表/库(建议)如果在登录情况下,......
  • Elasticsearch与MySql实现数据同步
    选择方案基于RabbitMq的异步通知流程如下:管理端对mysql数据库数据完成增、删、改后,发送MQ消息服务端监听MQ,接收到消息后完成elasticsearch数据修改优点:低耦合,实现难度一般缺点:依赖mq的可靠性实现步骤在管理端和服务端都导入依赖坐标和配置application.yml文件点击......
  • Mysql && Oracle case when用法
    CASEWHEN1.对值判断2.条件判断--方式一:对值判断SELECTCASE 指定字段 WHEN条件值1THEN 结果1 WHEN条件值2THEN 结果2 WHEN条件值3THEN 结果3 ELSE默认值 END字段别名FROM 表名SELECTCASE STATUS WHEN0THEN '等待' WHEN1THEN ......
  • Mysql如何新建一个用户并赋予视图权限
    Mysql如何新建一个用户并赋予视图权限 --新建用户CREATEUSER'viewUser'@'%'IDENTIFIEDBY'password'; -- 赋予视图权限GRANTSELECT,SHOWVIEWON`views`TO'viewUser'@'%' -- 并把视图内容关系到的表权限赋予新用户GRANTSELECTON`tableName`......
  • MYSQL级联查询,包括向上向下的级联
    --名称:mysql递归查询存储过程(2014-04-05)--入:@table表名[varchar(200)]--入:@field要查询返回的字段名(例如:name,age,remark)[text]--入:@order返回结果的排序(例如namedesc,ageasc)[text]--入:@idName主键列名[varchar(200)]--入:@pidName父键列名[var......
  • MySQL逻辑架构图
    整体架构MySQL可以分为Server层和存储引擎层两部分。不同的存储引擎(不同的表可以设置不同的存储引擎)共用一个Server层(从连接器到执行器)。查询流程连接器Command列显示Sleep表示空闲连接。如果客户端太长时间没动静,那么连接器会自动将它断开,由参数wait_timeout控制,默认值是8......
  • 数据库管理工具远程连接MySQL实例服务失败Host ... is not allowed to connect to thi
    MySQL社区版数据库8.0版本添加账号、分配权限、删除账号MySQL安全连接失败问题排查......
  • 4、数据库:MySQL部署 - 系统部署系列文章
          MySQL数据库在其它博文中有介绍,包括学习规划系列。今天就讲讲MySQL的部署事情。一、先下载MySQL数据库;到下面这个网址去下载数据库,这里下载的社区版:https://dev.mysql.com/downloads/installer/二、安装数据库;打开EXE文件;       ......