mysql 樹形彙總 mysql 遞迴查詢樹形目錄

2021-10-20 22:31:07 字數 2349 閱讀 8043

早些時候看到一篇《一句sql實現mysql的遞迴查詢》,但是必須是在 id大於pid 的情況下才能使用。

建立**

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

改了一下,沒有這個限制,ssid應該也能使用。

1 select *,2 @pn:=pid,3 @path:=(4 selectgroup_concat(5 substring_index(6 @pn:= (select concat(pid,'|',nodename) from treenodes where id=substring_index(@pn,'|',1)),7 '|',8 -1)9 order by id desc separator '-')10 from treenodes where @pn is notnull order by id asc)11 aspath,12 length(@path) - length(replace(@path, '-', ''))+1 aslv13 from treenodes;

結果如下

mysql欄位彙總

型別 描述int 一種數值型別,值的範圍如下 帶符號的 2147483648 2147483647 不帶符號的0 4294967295 最多十位,所以存手機號是不行的 decimal 一種數值型別,支援浮點數或者小數 double 一種數值型別,支援雙精度浮點數 date yyyymmdd格式的日期...

MySQL問題彙總

1.先刪除前面5條記錄,然後再插入,mysql會自動填補5條記錄的位置,但id還是從8自增,中顯示的從40開始是因為我前面又做了其他的操作。好像這是mysql的優化,你刪除了前面的 後面生成的 會去補那個地方,就是刪除時 不刪除 標識 再有新的 直接蓋上了,類似我們的檔案系統 估計像是檔案碎片修復一...

MySQL日誌彙總

log type information written to log error log problems encountered starting,running,or stoppingmysqld general query log established client connections...