mysql之递归sql

mysql之递归sql

递归sql在一些公司是不允许使用的,会涉及数据库压力,所以会在代码里递归查询,但有些公司开发流程没有规定,且数据库数据量不大,之前写过好几遍了,老是记不住,记录一下

通过父级id查询所有子集(不包括父级)

方案一:不带查询的本层级

# 0.4s
select  id,name,parent_id 
from    (select * from products # 表名order by parent_id, id) products_sorted,(select @pv := '你的id') initialisation
where   find_in_set(parent_id, @pv)
and     length(@pv := concat(@pv, ',', id))

方案二:带查询本层级

# 1.55s
SELECTID.LEVEL,org.* 
FROM(SELECT@ids AS _ids,( SELECT @ids := GROUP_CONCAT( id ) FROM sys_org WHERE FIND_IN_SET(parent_id, @ids ) ) AS cids,@l := @l + 1 AS LEVEL FROMsys_org,( SELECT @ids := '查询的id', @l := 0 ) b WHERE@ids IS NOT NULL ) ID,sys_org org 
WHEREFIND_IN_SET( org.id, ID._ids ) 
ORDER BYLEVEL

在这里插入图片描述

从子集向上递归

方案一:

SELECT T2.id, T2.name, T2.parent_id,T1.lvl
FROM(SELECT@r AS rid,(SELECT @r := parent_id FROM sys_org WHERE id = rid) AS parent_id,@l := @l + 1 AS lvl FROM( SELECT @r := '你要查询的id', @l := 0 ) vars,sys_org h #递归表WHERE@r <> 0 #父id条件) T1JOIN sys_org T2 ON T1.rid = T2.id 
ORDER BYT1.lvl DESC

方案二:

SELECT T2.id, T2.parent_id, T2.name
FROM (SELECT @r AS _id, (SELECT @r := parent_id FROM sys_org WHERE id = _id) AS parent_idFROM (SELECT @r := '你要查询的id') vars,sys_org h WHERE @r <> 0) T1 JOIN sys_org T2 ON T1._id = T2.id

mysql8.0神级递归

 
WITH RECURSIVE org_tree (id,parent_id) AS (# 初始查询,选择根节点(例如,没有父节点的节点)  SELECT id, parent_idFROM sys_org #要递归的表明WHERE parent_id = 0 #递归的父idUNION ALL-- 递归查询,选择当前层级的子节点SELECT o.id, o.parent_idFROM sys_org oINNER JOIN org_tree ot ON o.parent_id = ot.id
)
SELECT * FROM org_tree;# 查询mysql版本
SELECT VERSION();

这里 org_tree为虚拟表,在递归部分,我们先通过一个初始查询(sys_org )得到一些初始的结果。然后我们通过UNION ALL运算将初始结果集合并到递归查询结果中。接下来,在每次递归查询中,我们使用前一次递归的结果(org_tree)与递归查询(sys_org )进行运算,并使用WHERE条件过滤掉不需要的数据。最后,在终止条件部分中,我们使用一个条件来判断递归查询何时停止。当递归查询到终止条件时,递归查询结束,最终结果被返回

WITH RECURSIVE:
# 表示要使用递归查询的方式处理数据。
UNION:
# 表示将两个查询结果集进行联合,使用UNION ALL则表示保留重复数据。
SELECT * FROM 临时表:
# 表示最终返回的查询结果集,可以通过临时表查询表中的列名进行指定。

如果还是不是很理解可以参考:MySQL递归查询超详细–保姆级别讲解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/841454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Thrift快速入门开发demo

Thrift快速入门开发demo 一、认识Thrift thrift是什么?一个RPC 代码生成框架,使用它的IDL(Interface Defination Language,接口定义语言)定义你想要实现的接口,然后它就会生成对应语言的远程调用框架代码,用户只需要实现接口逻辑,不用关心具体的细节。 tutorial:htt…

特征变换,分箱

特征变换 分箱 为什么分箱 连续数值离散化 降低异常值带来的影响 提升模型的稳定性 如何分箱 等频 等距 卡方 风控场景下常用 决策树 …

牛客网刷题 | BC94 反向输出一个四位数

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 将一个四位数&…

【Linux初探】:解锁开源世界的神秘钥匙

文章目录 &#x1f680;一、了解Linux&#x1f525;二、Linux 的发行版❤️三、Linux应用领域&#x1f4a5;四、Linux vs Windows & mac &#x1f680;一、了解Linux Linux是一种自由、开放源代码的操作系统&#xff0c;它的内核由芬兰计算机科学家Linus Torvalds在1991年创…

LeetCode题练习与总结:二叉树的层序遍历Ⅱ--107

一、题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09; 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[…

【评价类模型】层次分析法(AHP)

1.评价类思想综述&#xff1a; 明确评价主体–>评价指标确定–>计算指标权重–>方案评价 1.1指标确定&#xff1a; 可以通过一个思维导图的方式来画出一个指标系统&#xff0c;先确定方向&#xff0c;再向下细化 注意&#xff1a;指标需要具有贴合性和独立性。 贴合…

如何搭建一个API

搭建一个API&#xff08;应用程序编程接口&#xff09;通常涉及以下几个步骤&#xff1a; 1. 确定API的目的和需求 明确你希望通过API实现的功能和目标。确定API将提供哪些数据和服务。 2. 设计API 定义端点&#xff08;Endpoints&#xff09;&#xff1a;确定API的URL结构…

破解:既要及即时相应,又要并行运行后台任务? FastAPI + asyncio

开发响应迅速且高效的Web应用程序是开发者的首要目标之一。一个常见的需求是&#xff0c;当触发一个端点时能够并行执行多个任务&#xff0c;但在第一个任务完成后立即返回响应&#xff0c;同时其余任务继续在后台运行。 挑战 假设在触发一个端点时&#xff0c;你有三个耗时任…

打造游戏APP:面向对象编程的实战演练

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、项目背景与架构概览 二、类的设计与实现 三、面向对象编程的实践 四、游戏循环与事件…

Vue CLI 的服务介绍与使用(2024-05-20)

1、介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统&#xff0c;提供&#xff1a; 通过 vue/cli 实现的交互式的项目脚手架。 通过 vue/cli vue/cli-service-global 实现的零配置原型开发。 一个运行时依赖 (vue/cli-service)&#xff0c;该依赖&#xff1a; 可升级…

详解混合A*算法Hybrid A*

混合A算法(Hybrid A)是一种改进的路径规划算法,特别针对车辆动力学进行了优化。以下是对混合A*算法的详细解释: 一、算法背景 混合A算法是在A算法的基础上发展而来的,旨在解决A算法在高维连续空间中的效率问题以及运动约束的问题。A算法虽然广泛应用于图或者网络中的路径…

linux中系统调用的原理

Linux中系统调用的原理涉及到用户态和内核态之间的切换以及参数传递。下面我将以用户态调用libc的time()函数为例,详细说明整个代码处理流程: 用户态代码调用time()函数: 用户程序包含<time.h>头文件,调用time()函数,并传入一个time_t类型的指针参数,用于存储获取到…

单片机原理及技术(二)—— AT89S51单片机(一)(C51编程)

目录 一、AT89S51单片机的片内硬件结构 二、AT89S51的引脚功能 2.1 电源及时钟引脚 2.2 控制引脚 2.3 并行 I/O口引脚 三、AT89S51的CPU 3.1 运算器 3.1.1 算术逻辑单元&#xff08;ALU&#xff09; 3.1.2 累加器A 3.1.3 程序状态字寄存器&#xff08;PSW&#xff09…

Spring6框架中依赖注入的多种方式(推荐构造器注入)

你好&#xff0c;这里是codetrend专栏“Spring6全攻略”。 一个典型的企业应用程序不是由单个对象&#xff08;或在Spring术语中称为bean&#xff09;组成的。 即使是最简单的应用程序也有一些对象一起工作&#xff0c;呈现给最终用户看到的内容形成一个连贯的应用程序。 要…

谈谈你对 vue 的理解 ?

1.谈谈你对 vue 的理解 ? 官方: Vue是一套用于构建用户界面的渐进式框架,Vue 的核心库只关注视图层 2. 声明式框架 Vue 的核心特点,用起来简单。那我们就有必要知道命令式和声明式的区别! 早在 JQ 的时代编写的代码都是命令式的,命令式框架重要特点就是关注过程 声明…

【目标检测】关于YOLO系列算法中Confidence置信度的计算和理解

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。(专栏订阅用户订阅专栏后免费提供数据集和源码一份,超级VIP用户不在服务范围之内) 路虽远,行则将至;事虽难,做…

esp32 idf开发中的常用命令

git config --global --unset http.proxy 取消代理 git config --global --unset https.proxy 取消代理 ipconfig/flushdns 清除dns缓存 idf.py fullclean ​​​​​​​ ​​​​​…

39、Flink 的窗口剔除器(Evictors)详解

Evictors Flink 的窗口模型允许在 WindowAssigner 和 Trigger 之外指定可选的 Evictor&#xff0c;通过 evictor(...) 方法传入 Evictor。 Evictor 可以在 trigger 触发后、调用窗口函数之前或之后从窗口中删除元素&#xff0c; Evictor 接口提供了两个方法实现此功能&#x…

LDAP: error code 32 - No Such Object

目前我的项目版本&#xff1a; Spring版本:5.3.15SpringBoot版本:2.6.3 完整错误 org.springframework.ldap.NameNotFoundException: [LDAP: error code 32 - No Such Object]; nested exception is javax.naming.NameNotFoundException: [LDAP: error code 32 - No Such Objec…

spring boot 的常用注解

Autowired与 Resource的区别 1、Autowired与Resource都是要装配bean Autowired是通过byType来注入 Resource是同通过byName来注入 一、Autowired Autowired默认是按类型&#xff08;type也就是参数化类型&#xff09;装配&#xff08;这个注解是属于spring的&#xff09;&am…