在 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发布)

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

  1. Mysql中一千万条数据怎么快速查询

    文章来源: 学习通http://www.bdgxy.com/ 目录 普通分页查询 如何优化 偏移量大 采用id限定方式 优化数据量大问题 普通分页查询 当我们在日常工作中遇到大数据查询的时候,第一反应 ...

  2. 一、TCL事务控制语言 二、MySQL中的约束 三、多表查询(重点) 四、用户的创建和授权 五、MySQL中的索引...

    一.TCL事务控制语言 ###<1>事务的概念 事务是访问并可能更新数据库中各种数据项的执行单元. 事务是一条SQL语句,一组SQL语句,或者整个程序. 事务是恢复和并发控制的基本单位. ...

  3. mysql中len是什么意思_MySQL的查询计划中ken_len的含义

    本文首先介绍了MySQL的查询计划中ken_len的含义:然后介绍了key_len的计算方法:最后通过一个伪造的例子,来说明如何通过key_len来查看联合索引有多少列被使用. key_len的含义 ...

  4. mysql中如何将几个没有关系的结果集放在一起

    昨天在做报表的时候,遇到要把类型A的数据和类型B的数据横向放在一个表中展示,两个之间没什么关系,哪个的数据量多也不确定,废了段时间,才折腾出如下的解决方法:需要将SELECTes.nameprimar ...

  5. mysql中增加45天三小时_MySQL查询以45天为间隔添加天数并在新列中显示输出

    为此,您可以使用date_add().让我们首先创建一个表-mysql> create table DemoTable1930 ( DueTime datetime ); 使用插入命令在表中插入 ...

  6. mysql中的参数如何调试_mysql 查询优化 ~ 查询参数调节

    mysql优化基础之参数调节 一 简介:我们谈谈如何调节mysql参数加速查询 二 相关参数 1 排序参数 sort_buffer_size 当出现order by时会利用到这个参数,当数据量超过内存 ...

  7. mysql中in嵌套多层时_sql 嵌套查询 in

    嵌套查询是将一个select 查询放到另一个查询的where  子句中去 如:查询"xx"同学的所修课程及分数 1.先选择姓名为"xx"的同学的学号 selec ...

  8. mysql中having的例子_mysqlgroupby/having/distinct查询使用例子_MySQL

    表的内容如下: //查询单分数最高的人ID select stuid,max(score) from stu_select_class; // 查询各科总分2-3名的学生 select stuid, ...

  9. MySQL 中 delete where in 语句的子查询限制

    根据ID删除数据,代码如下: DELETE FROMt_swcas_db_sync_send_task WHEREid IN (SELECTb.id AS idFROMt_swcas_db_old_p ...

最新文章

  1. vue-cli的使用
  2. 详解单链表经典OJ题
  3. 【Python】全网最新最全Pyecharts可视化教程(一)
  4. 括号配对问题_栈stack
  5. MySQL(六)常用语法和数据类型
  6. 非常详细的Exchange 功能路线图
  7. 人脸检测江湖的那些事儿——从旷视说起
  8. rsa前后端加密流程_不懂前后端分离?这篇就够了
  9. 基于C语言EOF与getchar()的使用详解
  10. flux服务器推消息,服务端主动推送数据,除了 WebSocket 你还能想到啥?
  11. HTML-CSS线性渐变
  12. android刷机教程 华为,华为的安卓手机该怎么刷机
  13. html 菜鸟驿站,菜鸟驿站
  14. 洛谷P5708 【深基2.习2】三角形面积__C++描述
  15. 【Linux数据库注意问题】java.sql.SQLSyntaxErrorException: Table ‘e.USER‘ doesn‘t exist
  16. 数据库面试题SQL篇
  17. MVP、EMC、CRM、IoT、边缘计算盒子、系统群控、数字化赋能、EMS、冷媒
  18. tf.Variable
  19. [Revit二次开发] 轴网交点创建柱子
  20. oracle静默安装报错,静默安装Oracle11gR2 [FATAL] [INS-32015]报错

热门文章

  1. 有关颜色敏感度测试的软件是啥,色彩敏感度测试:你是色盲吗?
  2. 使用Jenkins自动编译我的.net 项目
  3. 伯德图 matlab,matlab画三维伯德图,bode图
  4. 台风下雨天出行要注意 穿鞋不当危害足部健康
  5. 董明珠的权力危机:半年两位元老出局,格力进入动荡时刻
  6. 大学生电子设计大赛最全资料
  7. 成为职业游戏建模师有没有前景,未来自己该如何发展学习
  8. 基于词典的细粒度情感分析
  9. 武汉 华为 android,【武汉华为手机大全】武汉华为手机报价及图片大全-列表版-ZOL中关村在线...
  10. mac网易邮箱smtp服务器,网易企业邮箱MAC mail客户端设置