众所周知,目前的mysql版本中并不支持直接的递归查询,但是通过递归到迭代转化的思路,还是可以在一句SQL内实现树的递归查询的。这个得益于Mysql允许在SQL语句内使用@变量。以下是示例代码。

创建表格

  1. CREATE TABLE `treenodes` (
  2. `id` int , -- 节点ID
  3. `nodename` varchar (60), -- 节点名称
  4. `pid` int -- 节点父ID
  5. );

插入测试数据

  1. INSERT INTO `treenodes` (`id`, `nodename`, `pid`) VALUES
  2. ('','A',''),('','B',''),('','C',''),
  3. ('','D',''),('','E',''),('','F',''),
  4. ('','G',''),('','H',''),('','I',''),
  5. ('','J',''),('','K',''),('','L',''),
  6. ('','M',''),('','N',''),('','O',''),
  7. ('','P',''),('','Q',''),('','R',''),
  8. ('','S',''),('','T',''),('','U','');

查询语句

  1. SELECT id AS ID,pid AS ID ,levels AS 父到子之间级数, paths AS 父到子路径 FROM (
  2. SELECT id,pid,
  3. @le:= IF (pid = 0 ,0,
  4. IF( LOCATE( CONCAT('|',pid,':'),@pathlevel) > 0 ,
  5. SUBSTRING_INDEX( SUBSTRING_INDEX(@pathlevel,CONCAT('|',pid,':'),-1),'|',1) +1
  6. ,@le+1) ) levels
  7. , @pathlevel:= CONCAT(@pathlevel,'|',id,':', @le ,'|') pathlevel
  8. , @pathnodes:= IF( pid =0,',0',
  9. CONCAT_WS(',',
  10. IF( LOCATE( CONCAT('|',pid,':'),@pathall) > 0 ,
  11. SUBSTRING_INDEX( SUBSTRING_INDEX(@pathall,CONCAT('|',pid,':'),-1),'|',1)
  12. ,@pathnodes ) ,pid ) )paths
  13. ,@pathall:=CONCAT(@pathall,'|',id,':', @pathnodes ,'|') pathall
  14. FROM treenodes,
  15. (SELECT @le:=0,@pathlevel:='', @pathall:='',@pathnodes:='') vv
  16. ORDER BY pid,id
  17. ) src
  18. ORDER BY id

最后的结果如下:

  1. ID ID 父到子之间级数 父到子路径
  2. ------ ------ ------------ ---------------
  3. 1 0 0 ,0
  4. 2 1 1 ,0,1
  5. 3 1 1 ,0,1
  6. 4 2 2 ,0,1,2
  7. 5 2 2 ,0,1,2
  8. 6 3 2 ,0,1,3
  9. 7 6 3 ,0,1,3,6
  10. 8 0 0 ,0
  11. 9 8 1 ,0,8
  12. 10 8 1 ,0,8
  13. 11 8 1 ,0,8
  14. 12 9 2 ,0,8,9
  15. 13 9 2 ,0,8,9
  16. 14 12 3 ,0,8,9,12
  17. 15 12 3 ,0,8,9,12
  18. 16 15 4 ,0,8,9,12,15
  19. 17 15 4 ,0,8,9,12,15
  20. 18 3 2 ,0,1,3
  21. 19 2 2 ,0,1,2
  22. 20 6 3 ,0,1,3,6
  23. 21 8 1 ,0,8

一句SQL实现MYSQL的递归查询的更多相关文章

  1. MySQL系列:一句SQL,MySQL是怎么工作的?

    对于MySQL而言,其实分为客户端与服务端. 服务端,就是MySQL应用,当我们使用net start mysql命令启动的服务,其实就是启动了MySQL的服务端. 客户端,负责发送请求到服务端并从服 ...

  2. Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决

    Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决 I. 概述 1.1 JDBC概念 JDBC(Java Database Connectivity ...

  3. go database/sql sql-driver/mysql 操作

    这里使用的是github.com/Go-SQL-Driver/MySQL, 所以需要下载一个github.com/Go-SQL-Driver/MySQL 引入 database/sql 和 githu ...

  4. sql 笔记(mysql)

    Windows 安装mysql(zip包) 1,zip包解压到要安装目录 2,配置环境变量,Path后加mysql路径\bin 3,修改配置文件,mysql目录下my-default.ini base ...

  5. 使用ODP.NET一次执行多句SQL语句

    在实际开发的时候有的时候希望一次执行多句SQL语句,又不想使用Transcation的话,可以直接将多句SQL语句拼接起来.例如: var sql = "Begin " + &qu ...

  6. Sql语句里的递归查询

    Sql语句里的递归查询 SqlServer2005和Oracle 两个版本 以前使用Oracle,觉得它的递归查询很好用,就研究了一下SqlServer,发现它也支持在Sql里递归查询举例说明:Sql ...

  7. Sql语句里的递归查询(转)

    原文摘自:http://blog.csdn.net/pdn2000/article/details/6674243 Sql语句里的递归查询 SqlServer2005和Oracle 两个版本 以前使用 ...

  8. 全国省市级联数据sql语句 mysql版

    全国省市级联数据sql语句 mysql版 --省级 provincial create table provincial ( provincialID int, provincialName ), p ...

  9. 从一句SQL得出的启示

    select count(*) + 1 from `table` where rank > (select rank from `table` where id = *) 上面那句SQL 给了我 ...

随机推荐

  1. 小巧实用的数字加减插件(jquery插件)

    2015-12-04 近期项目需要,我将插件更新了,增加了两个参数,一个参数控制文本框是否支持输入,另一个参数则是新增了一个回调函数,返回文本框内的值.另外对代码局部重构了,优化了一下封装,需要的朋友 ...

  2. js判断当前操作系统

    function validataOS(){ if(navigator.userAgent.indexOf(“Window”)>0){ return ”Windows”; }else if(na ...

  3. 求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字

    #include <iostream> using namespace std; int main() {long long s,n,i,j,p;s=0; cin>>n;    ...

  4. Visual Studio的广告剧

    一个热衷于code的developer,一个热衷于developer的girl,他们将发生怎样的故事? 第一集:<想做你的Code> 第二集:<让爱延长> 第三集:<幸福 ...

  5. AES CBC 128的实现

    原由 AES已经变成目前对称加密中最流行算法之一,AES可以使用128.192.和256位密钥,并且用128位分组加密和解密数据. 项目中需要使用AES对密码信息进行加密,由嵌入式设备使用C语言进行加 ...

  6. Sql 高效分页

    http://www.111cn.net/database/mysql/46350.htm http://g.kehou.com/t1032617472.html http://www.cnblogs ...

  7. Oracle优化笔记

    2016-11-22   子查询:标量子查询 内联视图(in-line view) 半连接/反连接   标量子查询 select 后跟子查询 类似自定义函数 可用开窗函数之类的改写   内联视图(in ...

  8. poj2752 Seek the Name, Seek the Fame

    Description The little cat is so famous, that many couples tramp over hill and dale to Byteland, and ...

  9. 【剑指offer】面试题39:二叉树的深度

    题目: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 思路: 根的深度=MAX(左子树深度,右子树深度)+1; Code: ...

  10. 【hihoCoder第十四周】无间道之并查集

    就是基础的并查集.0代表合并操作,1代表查询操作.一开始以为会卡路径压缩,忐忑的交了一版裸并查集,结果AC了.数据还是很水的. 以后坚持做hiho,当额外的练习啦~ #include <bits ...