mysql with 遞迴 mysql遞迴

2021-10-17 11:35:25 字數 1730 閱讀 6590

sql server可以用with as 語法,mysql沒有這個功能,只能用別的方式了,目前的mysql版本中並不支援直接的遞迴查詢,但是通過遞迴到迭代轉化的思路,還是可以在一句sql內實現樹的遞迴查詢的。這個得益於mysql允許在sql語句內使用@變數。以下是示例**。 建立** 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 複製**

MySQ樹狀結構資料 遞迴查詢

for example create table products id int,name varchar 100 parent id int insert into products values 15,category15 0 not a descendant of 19 16,category...

mysql with操作 mysql中的表操作

恢復內容開始 建立資料庫 create database 資料庫名 切換資料庫 use 資料庫名 建表 create table 表名 欄位名1,型別,約束 欄位名2,型別,約束 約束 1.主鍵約束 1 直接在建表時字段型別後加 primary key 2 在表最後加 constraint 約束名 ...

mysq比較時間

在oracle中使用時間函式to date習慣了,在oracle中時間的加減也非常簡單,直接加減即可。在mysql中時間的函式很多,非常自由。在專案中經常用到的就是時間的加減。比如60天前,oracle中直接就是sysdate 60,mysql中就不行。對時間加減的函式是 加adddate 減sub...