一句SQL實現MYSQL的遞迴查詢

2021-08-22 14:55:49 字數 2704 閱讀 7581

建立**

create table `treenodes` (

`id` int , -- 節點id

`nodename` varchar (60), -- 節點名稱

`pid` int -- 節點父id

);

插入測試資料

insert into `treenodes` (`id`, `nodename`, `pid`) values

('1','a','0'),('2','b','1'),('3','c','1'),

('4','d','2'),('5','e','2'),('6','f','3'),

('7','g','6'),('8','h','0'),('9','i','8'),

('10','j','8'),('11','k','8'),('12','l','9'),

('13','m','9'),('14','n','12'),('15','o','12'),

('16','p','15'),('17','q','15'),('18','r','3'),

('19','s','2'),('20','t','6'),('21','u','8');

查詢語句

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 一句sql 分頁

有關分頁 sql 的資料很多,有的使用儲存過程,有的使用游標。本人不喜歡使用游標,我覺得它耗資 效率低 使用儲存過程是個不錯的選擇,因為儲存過程是經過預編譯的,執行效率高,也更靈活。先看看單條 sql 語句的分頁 sql 吧。方法1 適用於 sql server 2000 2005 select t...

一句SQL搞定分頁

xpsql 使用者名稱 like 王 sql string.format select from select row number over order by as keelid,from as keeltemp where keeltemp.keelid and keeltemp.keelid ...

mysql 匯出一句話 MySQL 匯出一句話

drop table if exists temp 如果存在temp就刪掉 create table temp cmd text not null 建立temp表,裡面就乙個cmd欄位 insert into temp cmd values php eval post cmd 把一句話木馬插入到te...