`

MySQL中单句实现无限层次父子关系查询

 
阅读更多
在 SQL Server 中,使用 CTE 表达式很容易做到无限层次父子关系查询;在不支持CTE表达式的版本中,借助函数递归也可以轻松实现。
在 MySQL 中,这个需求的实例稍显复杂, MySQL 中没有支持递归的查询,没有表值函数,函数不支持递归,所以通常都是用循环实现,显得比较别扭。今天看到一个用单条语句实现的递归查询,想法独特,分享一下。

表结构和数据

CREATE TABLE table1(id int, name varchar(10), parent_id int);
INSERT table1 VALUES
(1, ‘Home’, 0),
(2, ‘About’, 1),
(3, ‘Contact’, 1),
(4, ‘Legal’, 2),
(5, ‘Privacy’, 4),
(6, ‘Products’, 1),
(7, ‘Support’, 2);

查询 id = 5 的所有父级

SELECT ID.level, DATA.* FROM(
SELECT
@id as _id,
( SELECT @id := parent_id
FROM table1
WHERE id = @id
) as _pid,
@l := @l+1 as level
FROM table1,
(SELECT @id := 5, @l := 0 ) b
WHERE @id > 0
) ID, table1 DATA
WHERE ID._id = DATA.id
ORDER BY level;

根据这个父级查询方法,很容易可以写出查所有子级的,下面的查询 id=2 的所有子级

SELECT ID.level, DATA.* FROM(
SELECT
@ids as _ids,
( SELECT @ids := GROUP_CONCAT(id)
FROM table1
WHERE FIND_IN_SET(parent_id, @ids)
) as cids,
@l := @l+1 as level
FROM table1,
(SELECT @ids :=’1’, @l := 0 ) b
WHERE @ids IS NOT NULL
) id, table1 DATA
WHERE FIND_IN_SET(DATA.id, ID._ids)
ORDER BY level, id
---------------------
作者:zjcxc--个人微信公共号同名
来源:CSDN
原文:https://blog.csdn.net/zjcxc/article/details/78819656
版权声明:本文为博主原创文章,转载请附上博文链接!
分享到:
评论

相关推荐

    mysql全备文件中单表恢复shell脚本实现.txt

    mysql全备之后,如果进行单表恢复,还要写sed对全备sql进行单表结构和数据进行筛选,紧急情况下,难免耗时耗力,特别是对sed工具不是很熟的情况,所以本人写了此脚本,亲测可用,分享给需要的人参考

    Java多线程编程环境中单例模式的实现

    ### Java多线程编程环境中单例模式的实现 #### 概述 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在Java中,单例模式的应用非常广泛,特别是在资源管理、日志记录、...

    FPGA中单精度浮点乘法器的实现.pdf

    FPGA中单精度浮点乘法器的实现.pdf

    Ns2中单播动态路由的实现与扩展

    ### Ns2中单播动态路由的实现与扩展 #### 摘要 NS2作为一个在学术界和工业界广泛采用的网络仿真器,对于网络研究者来说具有重要的价值。然而,由于其复杂的路由协议实现过程,使得研究人员难以对现有路由模块进行...

    JAVA中单例模式的几种实现方式.doc

    ### JAVA中单例模式的几种实现方式 #### 1. 线程非安全的基本实现方式 单例模式是设计模式中的一种常用形式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。在Java中,单例模式可以通过多种方式来...

    SQL Server中单引号的两种处理技巧

    总结,处理SQL Server中单引号问题的关键在于理解转义字符的概念以及如何利用参数化查询的优势。在实际编程中,推荐使用参数化查询,以提高性能和安全性。同时,为了防止SQL注入攻击,应避免直接在SQL语句中拼接用户...

    10.ESQL/C中单记录的检索和查询.doc

    ### ESQL/C中单记录的检索和查询 #### 一、概述 在INFORMIX-ESQL/C应用开发中,单记录的检索和查询是非常重要的基础技能之一。本章将重点介绍如何使用`SELECT`语句来实现这一功能。通过学习本章内容,您将能够掌握...

    VC中单文档静态分隔条的实现

    在Microsoft Visual C++ (VC++) 开发环境中,创建一个单文档界面(Single Document Interface, SDI)应用程序并实现静态分隔条(Fixsplit)是一项常见的需求。这允许用户在同一个文档窗口内查看和操作不同的视图,...

    multisim中单相桥式PWM逆变电路的仿真

    在这个“multisim中单相桥式PWM逆变电路的仿真”项目中,我们将深入探讨如何利用Multisim来构建和分析一个基于IGBT(绝缘栅双极晶体管)的单相桥式脉宽调制(PWM)逆变电路。 首先,IGBT是一种电力电子开关元件,...

    C#中单例的实现方法

    本文实例讲述了C#中单例的实现方法。分享给大家供大家参考。具体实现方法如下: 代码如下: #region “实现这个窗口类的单例,单例类常用于被主窗口以show()方法打开的窗口,使用单例后只会打开一个此类的对象”  /...

    JavaScript实现GridView中单选框,复选框的嵌套

    ### JavaScript 实现 GridView 中单选框、复选框与下拉列表的嵌套 #### 单选框嵌套 GridView 在软件开发过程中,经常会遇到需要处理用户界面元素(如单选框、复选框等)与数据绑定组件(如 GridView)结合使用的...

    网页中单表格支持横纵表头锁定

    网页中单表格支持横纵表头锁定,网页中单表格支持横纵表头锁定

    MySQL_5.5中文参考手册.pdf

    - **表的最大规模**:探讨了MySQL中单个表可以达到的最大尺寸限制。 - **2000年兼容性**:关于MySQL在2000年前后版本间的兼容性问题。 - **MaxDB数据库管理系统概述**: - 对比MySQL和MaxDB之间的特点差异。 - ...

    Excel中单选钮的应用——制作单选题.pdf

    如果不希望分组框的边框线显示,可以通过VBA编辑器实现。在"立即窗口"输入`ActiveSheet.GroupBoxes.Visible = False`,执行后分组框的边框线将被隐藏。若需显示,只需将"False"改为"True"。 5. **统计成绩**: ...

    VC++中单个键盘按键的响应

    该工程主要实现对键盘单个按键的响应,工程目录中还附上了一个名为《配套文档-VC单个键盘按键的响应.pdf》的文档,对VC++中单个键盘按键的响应进行详细的说明,其中包含了作者为你精心准备的每个键盘按键对应的十...

    Android中单选框RadioButton修改默认图片

    在Android开发中,`RadioButton`是用户界面中常见的一种组件,用于实现单选功能,即在多个选项中只能选择一个。在默认情况下,`RadioButton`显示一个小圆点,表示当前选中的状态。然而,为了满足特定的设计需求,...

Global site tag (gtag.js) - Google Analytics