mysql家譜表查詢某人所有后代

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?@pLevel=@pLevel+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
? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享