一句SQL实现MYSQL的递归查询
众所周知,目前的mysql版本中并不支持直接的递归查询,但是通过递归到迭代转化的思路,还是可以在一句SQL内实现树的递归查询的。这个得益于Mysql允许在SQL语句内使用@变量。以下是示例代码。
创建表格
- CREATE TABLE `treenodes` (
- `id` int , -- 节点ID
- `nodename` varchar (60), -- 节点名称
- `pid` int -- 节点父ID
- );
插入测试数据
- INSERT INTO `treenodes` (`id`, `nodename`, `pid`) VALUES
- ('','A',''),('','B',''),('','C',''),
- ('','D',''),('','E',''),('','F',''),
- ('','G',''),('','H',''),('','I',''),
- ('','J',''),('','K',''),('','L',''),
- ('','M',''),('','N',''),('','O',''),
- ('','P',''),('','Q',''),('','R',''),
- ('','S',''),('','T',''),('','U','');
查询语句
- SELECT id AS ID,pid AS 父ID ,levels AS 父到子之间级数, paths AS 父到子路径 FROM (
- SELECT id,pid,
- @le:= IF (pid = 0 ,0,
- IF( LOCATE( CONCAT('|',pid,':'),@pathlevel) > 0 ,
- SUBSTRING_INDEX( SUBSTRING_INDEX(@pathlevel,CONCAT('|',pid,':'),-1),'|',1) +1
- ,@le+1) ) levels
- , @pathlevel:= CONCAT(@pathlevel,'|',id,':', @le ,'|') pathlevel
- , @pathnodes:= IF( pid =0,',0',
- CONCAT_WS(',',
- IF( LOCATE( CONCAT('|',pid,':'),@pathall) > 0 ,
- SUBSTRING_INDEX( SUBSTRING_INDEX(@pathall,CONCAT('|',pid,':'),-1),'|',1)
- ,@pathnodes ) ,pid ) )paths
- ,@pathall:=CONCAT(@pathall,'|',id,':', @pathnodes ,'|') pathall
- FROM treenodes,
- (SELECT @le:=0,@pathlevel:='', @pathall:='',@pathnodes:='') vv
- ORDER BY pid,id
- ) src
- ORDER BY id
最后的结果如下:
- ID 父ID 父到子之间级数 父到子路径
- ------ ------ ------------ ---------------
- 1 0 0 ,0
- 2 1 1 ,0,1
- 3 1 1 ,0,1
- 4 2 2 ,0,1,2
- 5 2 2 ,0,1,2
- 6 3 2 ,0,1,3
- 7 6 3 ,0,1,3,6
- 8 0 0 ,0
- 9 8 1 ,0,8
- 10 8 1 ,0,8
- 11 8 1 ,0,8
- 12 9 2 ,0,8,9
- 13 9 2 ,0,8,9
- 14 12 3 ,0,8,9,12
- 15 12 3 ,0,8,9,12
- 16 15 4 ,0,8,9,12,15
- 17 15 4 ,0,8,9,12,15
- 18 3 2 ,0,1,3
- 19 2 2 ,0,1,2
- 20 6 3 ,0,1,3,6
- 21 8 1 ,0,8
一句SQL实现MYSQL的递归查询的更多相关文章
- MySQL系列:一句SQL,MySQL是怎么工作的?
对于MySQL而言,其实分为客户端与服务端. 服务端,就是MySQL应用,当我们使用net start mysql命令启动的服务,其实就是启动了MySQL的服务端. 客户端,负责发送请求到服务端并从服 ...
- Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决
Java与SQL Server, MySql, Oracle, Access的连接方法以及一些异常解决 I. 概述 1.1 JDBC概念 JDBC(Java Database Connectivity ...
- go database/sql sql-driver/mysql 操作
这里使用的是github.com/Go-SQL-Driver/MySQL, 所以需要下载一个github.com/Go-SQL-Driver/MySQL 引入 database/sql 和 githu ...
- sql 笔记(mysql)
Windows 安装mysql(zip包) 1,zip包解压到要安装目录 2,配置环境变量,Path后加mysql路径\bin 3,修改配置文件,mysql目录下my-default.ini base ...
- 使用ODP.NET一次执行多句SQL语句
在实际开发的时候有的时候希望一次执行多句SQL语句,又不想使用Transcation的话,可以直接将多句SQL语句拼接起来.例如: var sql = "Begin " + &qu ...
- Sql语句里的递归查询
Sql语句里的递归查询 SqlServer2005和Oracle 两个版本 以前使用Oracle,觉得它的递归查询很好用,就研究了一下SqlServer,发现它也支持在Sql里递归查询举例说明:Sql ...
- Sql语句里的递归查询(转)
原文摘自:http://blog.csdn.net/pdn2000/article/details/6674243 Sql语句里的递归查询 SqlServer2005和Oracle 两个版本 以前使用 ...
- 全国省市级联数据sql语句 mysql版
全国省市级联数据sql语句 mysql版 --省级 provincial create table provincial ( provincialID int, provincialName ), p ...
- 从一句SQL得出的启示
select count(*) + 1 from `table` where rank > (select rank from `table` where id = *) 上面那句SQL 给了我 ...
随机推荐
- 小巧实用的数字加减插件(jquery插件)
2015-12-04 近期项目需要,我将插件更新了,增加了两个参数,一个参数控制文本框是否支持输入,另一个参数则是新增了一个回调函数,返回文本框内的值.另外对代码局部重构了,优化了一下封装,需要的朋友 ...
- js判断当前操作系统
function validataOS(){ if(navigator.userAgent.indexOf(“Window”)>0){ return ”Windows”; }else if(na ...
- 求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; ...
- Visual Studio的广告剧
一个热衷于code的developer,一个热衷于developer的girl,他们将发生怎样的故事? 第一集:<想做你的Code> 第二集:<让爱延长> 第三集:<幸福 ...
- AES CBC 128的实现
原由 AES已经变成目前对称加密中最流行算法之一,AES可以使用128.192.和256位密钥,并且用128位分组加密和解密数据. 项目中需要使用AES对密码信息进行加密,由嵌入式设备使用C语言进行加 ...
- Sql 高效分页
http://www.111cn.net/database/mysql/46350.htm http://g.kehou.com/t1032617472.html http://www.cnblogs ...
- Oracle优化笔记
2016-11-22 子查询:标量子查询 内联视图(in-line view) 半连接/反连接 标量子查询 select 后跟子查询 类似自定义函数 可用开窗函数之类的改写 内联视图(in ...
- 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 ...
- 【剑指offer】面试题39:二叉树的深度
题目: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 思路: 根的深度=MAX(左子树深度,右子树深度)+1; Code: ...
- 【hihoCoder第十四周】无间道之并查集
就是基础的并查集.0代表合并操作,1代表查询操作.一开始以为会卡路径压缩,忐忑的交了一版裸并查集,结果AC了.数据还是很水的. 以后坚持做hiho,当额外的练习啦~ #include <bits ...