就用數據數據庫表地址數據(中國地區) 來說吧(用Windows 請使用 gbk !!)
可直接運行(去除注解)
存儲過程:
DELIMITER//
dropprocedureifexists findLChild//
/*iid遞歸父節點,layer允許遞歸深度*/
CREATEPROCEDUREfindLChild(iidbigint(20),layerbigint(20))
BEGIN
/*創建接受查詢的臨時表*/
createtemporary tableifnotexiststmp_table(idbigint(20),namevarchar(50))ENGINE=InnoDBDEFAULTCHARSET=utf8;
/*最高允許遞歸數*/
SET@@max_sp_recursion_depth=99;
calliterative(iid,layer);/*核心數據收集*/
select*fromtmp_table;/*展現*/
droptemporary tableif exists tmp_table;/*刪除臨時表*/
END;//
DELIMITER;
DELIMITER//
dropprocedureifexists iterative//
CREATEPROCEDUREiterative(iidbigint(20),layerbigint(20))
BEGIN
declaretidbigint(20)default-1;
declaretnamevarchar(50)charactersetutf8;
/*游標定義*/
declarecur1CURSORFORselectid,namefromlocationwherefid=iid;
declareCONTINUEHANDLERFORSQLSTATE'02000'SETtid=null;
/*允許遞歸深度*/
iflayer>0then
OPENcur1;
FETCHcur1INTOtid,tname;
WHILE(tidisnotnull)
DO
/*核心數據收集*/
insertintotmp_tablevalues(tid,tname);
calliterative(tid,layer-1);
FETCHcur1INTOtid,tname;
ENDWHILE;
endif;
END;//
DELIMITER;
//運行!!
MySQL> call findLChild(1,1);
+------+------------------+
| id | name |
+------+------------------+
| 2 | 北京 |
| 4 | 上海 |
| 6 | 香港特別行政區 |
| 8 | 澳門特別行政區 |
| 10 | 河北 |
| 23 | 山西 |
| 35 | 遼寧 |
| 50 | 吉林 |
| 60 | 黑龍江 |
| 74 | 江蘇 |
| 88 | 浙江 |
| 101 | 安徽 |
| 119 | 福建 |
| 129 | 江西 |
| 142 | 山東 |
| 160 | 河南 |
| 179 | 湖北 |
| 198 | 湖南 |
| 213 | 廣東 |
| 235 | 甘肅 |
| 250 | 四川 |
| 272 | 貴州 |
| 282 | 海南 |
| 301 | 雲南 |
| 318 | 青海 |
| 327 | 陝西 |
| 348 | 廣西壯族自治區 |
| 363 | 西藏自治區 |
| 371 | 寧夏回族自治區 |
| 377 | 新疆維吾爾自治區 |
| 400 | 內蒙古自治區 |
| 413 | 台灣省 |
+------+------------------+
32 rows in set (0.02 sec)