早些時候看到一篇《一句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...