create table `people` (
`id` int(11) not null,
`name` varchar(50) null default null,
`pid` int(11) not null default '0',
primary key (`id`)
create definer=`root`@`%` procedure `getchildren`(in `parentid` int)
language sql
not deterministic
contains sql
sql security definer
comment '獲取某人所有後代'
begin
#存放結果的臨時表
drop table if exists children;
create temporary table children select 0 plevel,p.* from `people` p where id=parentid;
#存放中間結果的臨時表
drop table if exists tem;
create temporary table tem select id from `people` limit 0;
#逐級填充後代
set @plevel=1;
repeat
#清空上次資料
truncate table tem;
#將當前level的後代id放入臨時表
insert into tem select p.id from `people` p, children c
where p.pid=c.id and c.plevel=(@plevel-1);
#將當前level的後代資料塞入結果臨時表
insert into children select @plevel plevel,p.* from `people` p, tem t
where p.id=t.id;
set @[email protected]+1;
until not exists (select * from tem) or @plevel > 10
end repeat;
#調整表結構,刪除臨時列和不需要的資料
alter table children drop column plevel;
delete from children where id=parentid;
#返回結果
select * from children;
end
PTA 冰島家譜
冰島是作為乙個人口稀少的國家,人群之間具有複雜的血緣關係,為了避免不必要的意外,他們的手機上都安裝了一款可以隨時查詢兩個人之間是否有血緣關係的軟體。現在你的任務就是實現這樣乙個功能,接收血緣關係的登記資訊,並在我們查詢時給出兩個人是否具有血緣關係。血緣關係具有自反性 傳遞性。一行整數n,以下n行,每...
PTA 家譜處理
這題一開始以為是大模擬,但是看了別人以後的題解發現,有更好的解法。我們可以觀察出,這個輸入順序決定了每個人的num 2個空格一定是他的父親,所以直接記錄就行,lca暴力跳就可以了,不用倍增。include include include include include include include...
家譜樹(拓撲)
家譜樹 問題描述 有個人的家族很大,輩分關係很混亂,請你幫整理一下這種關係。給出每個人的孩子的資訊。輸出乙個序列,使得每個人的後輩都比那個人後列出。輸入格式 第1行乙個整數n 1 n 100 表示家族的人數。接下來n行,第i行描述第i個人的兒子。每行最後是0表示描述完畢。輸出格式 輸出乙個序列,使得...