mysql 簡單遞迴 MySQL之遞迴小問題

2021-10-17 16:42:16 字數 3281 閱讀 9398

mysql本身不支援遞迴語法,但可通過自連線變相實現一些簡單的遞迴

--遞迴小方法:臨時表和普通表的不同方法

--這題使用的是2次臨時表查詢父節點的遞迴

drop table if exists test;

create table test(

id varchar(100),

name varchar(20),

parentid varchar(100)

insert test select

'13ed38f1-3c24-dd81-492f-673686dff0f3', '大學教師', '37e2ea0a-1c31-3412-455a-5e60b8395f7d' union all select

'1ce203ac-ee34-b902-6c10-c806f0f52876','小學教師', '37e2ea0a-1c31-3412-455a-5e60b8395f7d' union all select

'37e2ea0a-1c31-3412-455a-5e60b8395f7d', '教師' , null union all select

'c877b7ea-4ed3-f472-9527-53e1618cb1dc', '高數老師', '13ed38f1-3c24-dd81-492f-673686dff0f3' union all select

'ce50a471-2955-00fa-2fb7-198f6b45b1bd', '中學教師', '37e2ea0a-1c31-3412-455a-5e60b8395f7d';

delimiter $$

create procedure usp_ser(in idd varchar(100))

begin

declare lev int;

set lev=1;

drop table if exists tmp1;

drop table if exists tmp2;

create temporary table tmp1(id varchar(100),name varchar(20),parentid varchar(100),levv int);

create temporary table tmp2(pid varchar(100));

insert tmp2 select parentid from test where id=idd;

insert tmp1 select t.* , lev from test t join tmp2 a on t.id=a.pid;

while exists(select 1 from tmp2 )

dotruncate tmp2;

set lev=lev+1;

insert tmp2 select t.id from test t join tmp1 a on t.id=a.parentid and a.levv=lev-1;

insert tmp1 select t.*,lev from test t join tmp2 a on t.id=a.pid;

end while ;

select id,name,parentid from tmp1;

end;

delimiter ;

call usp_ser('c877b7ea-4ed3-f472-9527-53e1618cb1dc');

| id | name | parentid |

| 13ed38f1-3c24-dd81-492f-673686dff0f3 | 大學教師 | 37e2ea0a-1c31-3412-455a-5e60b8395f7d |

| 37e2ea0a-1c31-3412-455a-5e60b8395f7d | 教師 | null |

call usp_ser('13ed38f1-3c24-dd81-492f-673686dff0f3');

| id | name | parentid |

| 37e2ea0a-1c31-3412-455a-5e60b8395f7d | 教師 | null |

call usp_ser('37e2ea0a-1c31-3412-455a-5e60b8395f7d');

empty set (0.02 sec)

上面的方法因為由於mysql中不允許在同一語句中對臨時表多次引用,所以用2次臨時表

下面給個一次性用普通表完成的 查詢子節點的遞迴查詢

核心**

drop table if exists test;

create table test(

id int,

parentid int

insert test select

1, 0 union all select

2, 1 union all select

3, 1 union all select

4, 0 union all select

5, 2 union all select

6, 5 union all select

7, 3 ;

godelimiter $$

create procedure usp_ser(in idd varchar(100))

begin

declare lev int;

set lev=1;

drop table if exists tmp1;

create table tmp1(id int,parentid int ,levv int,ppath varchar(1000));

insert tmp1 select *,lev,id from test where parentid=idd;

while row_count()>0

doset lev=lev+1;

insert tmp1 select t.*,lev,concat(a.ppath,t.id) from test t join tmp1 a on t.parentid=a.id and levv=lev-1;

end while ;

select * from tmp1;

end;

delimiter ;

call usp_ser(0);

| id | parentid | levv | ppath |

| 1 | 0 | 1 | 1 |

| 4 | 0 | 1 | 4 |

| 2 | 1 | 2 | 12 |

| 3 | 1 | 2 | 13 |

| 5 | 2 | 3 | 125 |

| 7 | 3 | 3 | 137 |

| 6 | 5 | 4 | 1256 |

mysql 遞迴 mysql遞迴查詢

find in set 函式 函式語法 find in set str,strlist str 代表要查詢的字串 strlist 是乙個以逗號分隔的字串,如 a,b,c 此函式用於查詢 str 字串在字串 strlist 中的位置,返回結果為 1 n 若沒有找到,則返回0。concat 它用於連線n...

mySQL之簡單命令

ubuntu 安裝mysql sudo apt get install mysql server create database db 建立資料庫 show create database db 展示資料庫建立 alter database db charset utf8 修改資料庫編碼 drop ...

MYSQL之 簡單查詢

單錶查詢語句 檢視所有 select from teacher 檢視特殊的行 select from teacher where tid 2 檢視特殊字段 select tname from teacher 分頁查詢 select from score limit 0,5 limit 起點 個數 表...