Mysql單錶上下遞迴查詢

2021-10-21 17:28:17 字數 2003 閱讀 2710

首先建表nodelist.

create table nodelist(  

id int primary key, //本節點id。

nodename varchar(20), //節點名稱,為方便辨別而已。

pid int //父節點。

);

接著插入表資料.

insert into nodelist values(1,'a',null);  //id為父節點,即根節點。

insert into nodelist values(2,'b',1);

insert into nodelist values(3,'c',1);

insert into nodelist values(4,'d',2);

insert into nodelist values(5,'e',3);

insert into nodelist values(6,'f',3);

insert into nodelist values(7,'g',5);

insert into nodelist values(8,'h',7);

insert into nodelist values(9,'i',8);

insert into nodelist values(10,'j',8);

接著建立函式方法getchildlist():

create function `getchildlist`(rootid int) //rootid為你要查詢的節點。

returns varchar(1000)

begin

declare ptemp varchar(1000);

declare ctemp varchar(1000); //兩個臨時變數

set ptemp = '$';

set ctemp =cast(rootid as char); //把rootid強制轉換為字元。

while ctemp is not null do

set ptemp = concat(ptemp,',',ctemp); //把所有節點連線成字串。

select group_concat(id) into ctemp from nodelist

where find_in_set(pid,ctemp)>0;

end while;

return ptemp;

end

最後執行函式方法就會出現結果啦

getchildlist(1):
這是乙個下級查詢,如果需要要上級查詢轉換一下父子id的位置就可以了,**如下.

create function `getfatherlist`(rootid int) //rootid為你要查詢的節點。

returns varchar(1000)

begin

declare ptemp varchar(1000);

declare ctemp varchar(1000); //兩個臨時變數

set ptemp = '$';

set ctemp =cast(rootid as char); //把rootid強制轉換為字元。

while ctemp is not null do

set ptemp = concat(ptemp,',',ctemp); //把所有節點連線成字串。

select group_concat(pid) into ctemp from nodelist

where find_in_set(id,ctemp)>0;

end while;

return ptemp;

end

希望能對大家有幫助.

MySQL 單錶查詢

1 基本資料記錄查詢 列出表的所有字段 select field1,field2.fieldn from tablename 2 符號的使用 select from tablename 其中,符號 表示所有欄位名 tablename 引數表示表的名稱。3 條件資料記錄查詢 select field1...

Mysql單錶查詢優化

原文url 我最近碰到了很多效能很糟糕的mysql單錶查詢。原因很簡單 索引建立得不正確,導致執行計畫的效能低下。下面是一些能幫助你優化單錶查詢效能的要點。索引主要做3件事 過濾 filter 排序或分組 sort group 覆蓋 cover 前兩個沒什麼好說的,但並不是每個人都知道什麼叫 覆蓋索...

MySQL查詢資料之單錶查詢

單錶查詢的語法 select 字段 from 表名 查詢表中的所有資料 where 條件 加where查詢表的部分資料 eg select stu name,gender,stu on from student 不同欄位用逗號隔開 可以替換所有的字段細資訊 eg select from 表名 字段重...