微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL如何实现MYSQL的递归查询

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

创建表格

rush:sql;"> CREATE TABLE `treenodes` ( `id` int,-- 节点ID `nodename` varchar (60),-- 节点名称 `pid` int -- 节点父ID );

插入测试数据

rush:sql;"> INSERT INTO `treenodes` (`id`,`nodename`,`pid`) VALUES ('1','A','0'),('2','B','1'),('3','C',('4','D','2'),('5','E',('6','F','3'),('7','G','6'),('8','H',('9','I','8'),('10','J',('11','K',('12','L','9'),('13','M',('14','N','12'),('15','O',('16','P','15'),('17','Q',('18','R',('19','S',('20','T',('21','U','8');

查询语句

0,SUBSTRING_INDEX( SUBSTRING_INDEX(@pathlevel,CONCAT('|',-1),'|',1) +1,@le+1) ) levels,@pathlevel:= CONCAT(@pathlevel,id,':',@le,'|') pathlevel,@pathnodes:= IF( pid =0,',0',CONCAT_WS(',@pathall) > 0,SUBSTRING_INDEX( SUBSTRING_INDEX(@pathall,1),@pathnodes ),pid ) )paths,@pathall:=CONCAT(@pathall,@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,1
3 1 1,1
4 2 2,1,2
5 2 2,2
6 3 2,3
7 6 3,3,6
8 0 0,0
9 8 1,8
10 8 1,8
11 8 1,8
12 9 2,8,9
13 9 2,9
14 12 3,9,12
15 12 3,12
16 15 4,12,15
17 15 4,15
18 3 2,3
19 2 2,2
20 6 3,6
21 8 1,8

以上就是一句sql实现MysqL的递归查询的实现全过程,希望对大家的学习有所帮助。

原文地址:https://www.jb51.cc/mssql/63066.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐