描述:最近遇到了乙個問題,在mysql中如何完成節點下的所有節點或節點上的所有父節點的查詢? 在oracle中我們知道有乙個hierarchical queries可以通過connect by來查詢,但是,在mysql中還沒有對應的函式!!! 下面給出乙個function來完成的方法 下面是sql指令碼,想要執行的直接賦值貼上進資料庫即可。
好記性不如爛筆頭
下面給出乙個function來完成的方法
下面是sql指令碼,想要執行的直接賦值貼上進資料庫即可。
建立表treenodes(可以根據需要進行更改)
– table structure for treenodes
drop table if exists treenodes;
create table treenodes (
id int(11) not null,
nodename varchar(20) default null,
pid int(11) default null,
primary key (id)
) engine=innodb default charset=latin1;
– table structure for treenodes
插入幾條資料
– records of treenodes
insert into treenodes values (『1』, 『a』, 『0』);
insert into treenodes values (『2』, 『b』, 『1』);
insert into treenodes values (『3』, 『c』, 『1』);
insert into treenodes values (『4』, 『d』, 『2』);
insert into treenodes values (『5』, 『e』, 『2』);
insert into treenodes values (『6』, 『f』, 『3』);
insert into treenodes values (『7』, 『g』, 『6』);
insert into treenodes values (『8』, 『h』, 『0』);
insert into treenodes values (『9』, 『i』, 『8』);
insert into treenodes values (『10』, 『j』, 『8』);
insert into treenodes values (『11』, 『k』, 『8』);
insert into treenodes values (『12』, 『l』, 『9』);
insert into treenodes values (『13』, 『m』, 『9』);
insert into treenodes values (『14』, 『n』, 『12』);
insert into treenodes values (『15』, 『o』, 『12』);
insert into treenodes values (『16』, 『p』, 『15』);
insert into treenodes values (『17』, 『q』, 『15』);
把下面的語句直接貼上進命令列執行即可(注意修改傳入的引數,預設rootid,表明預設treenodes)
根據傳入id查詢所有父節點的id
delimiter //
create function `getparlist`(rootid int)
returns varchar(1000)
begin
declare stemp varchar(1000);
declare stemppar varchar(1000);
set stemp= '';
set stemppar=rootid;
#迴圈遞迴
while stempparis not nulldo
#判斷是否是第乙個,不加的話第乙個會為空
if stemp!= ''then
set stemp= concat(stemp,',',stemppar);
else
set stemp=stemppar;
end if;
set stemp= concat(stemp,',',stemppar);
select group_concat(pid) into stemppar from treenodeswhere pid<>id and find_in_set(id,stemppar)>0;
end while;
return stemp;
end//
執行命令
select * from treenodes where find_in_set(id,getparlist(15));
結果:
根據傳入id查詢所有子節點的id
delimiter //
create function `getchildlist`(rootid int)
returns varchar(1000)
begin
declare stemp varchar(1000);
declare stempchd varchar(1000);
set stemp= '$';
set stempchd=cast(rootid aschar);
while stempchdis not nulldo
set stemp= concat(stemp,',',stempchd);
select group_concat(id) into stempchd from treenodeswhere find_in_set(pid,stempchd)>0;
end while;
return stemp;
end//
執行命令
select * from treenodes where find_in_set(id,getchildlist(7));
結果:
扁平化組織和層級化組織
扁平化的特點是組織幅度大層次小,優點是資訊溝通順暢,適合做專案,做創新的企業。層級化組織的特點是幅度小層次多,管理剛性大,優點是效率高,執行力強,適合傳統行業。但我覺得沒有個好的網路化溝通協調工具,比如內部im,wiki之類,就不要談什麼扁平化了。而且最難的是,組織幅度提高之後,對管理者的要求太高了...
oracle遞迴查詢(層級查詢)
select from table t start with t.id id connect by prior t.id t.parentid 從對應id開始查,包括本節點和所以子節點 select from table t start with t.parentid pareanid connec...
SQL查詢層級樹
格式 select from 表名 where 條件3 start with 條件1 connect by prior 條件2 條件1 表示從哪個節點開始查詢,也就是通過條件1 查詢到的資料,作為後續查詢的起始節點 引數 條件2 是連線條件,其中用prior表示上一條記錄,例如connect by ...