藉助mysql 8.0的cte(它是iso sql標準的一部分),能夠實現遞歸,mariadb 10.2.2開始支持遞歸cte,以下:mysql
+----+----------+--------------+
| ID | ParentID | name |
+----+----------+--------------+
| 1 | 0 | 河南省 |
| 2 | 1 | 信陽市 |
| 3 | 2 | 淮濱縣 |
| 4 | 3 | 蘆集鄉 |
| 5 | 1 | 安陽市 |
| 6 | 5 | 滑縣 |
| 7 | 6 | 老廟鄉 |
| 8 | 2 | 固始縣 |
| 9 | 8 | 李店鄉 |
| 10 | 2 | 息縣 |
| 11 | 10 | 關店鄉 |
| 12 | 3 | 鄧灣鄉 |
| 13 | 3 | 臺頭鄉 |
| 14 | 3 | 谷堆鄉 |
| 15 | 1 | 南陽市 |
| 16 | 15 | 方城縣 |
| 17 | 1 | 駐馬店市 |
| 18 | 17 | 正陽縣 |
+----+----------+--------------+sql
由下而上express
sql:遞歸
with recursive r as
(
select * from c where id =11
union all
select c.* from c,r where c.id=r.ParentID
) select * from r order by id;it
result:io
+------+----------+-----------+
| ID | ParentID | name |
+------+----------+-----------+
| 1 | 0 | 河南省 |
| 2 | 1 | 信陽市 |
| 10 | 2 | 息縣 |
| 11 | 10 | 關店鄉 |
+------+----------+-----------+
mariadb
由上而下table
sql:原理
with recursive r as
(
select id,name from c where id=1
union all
select c.id,CONCAT(r.name, '>', c.name) as name from c,r where r.id = c.ParentID
)select id,name from r;
select
result:
+------+-----------------------------------------+
| id | name |
+------+-----------------------------------------+
| 1 | 河南省 |
| 2 | 河南省>信陽市 |
| 5 | 河南省>安陽市 |
| 15 | 河南省>南陽市 |
| 17 | 河南省>駐馬店市 |
| 3 | 河南省>信陽市>淮濱縣 |
| 6 | 河南省>安陽市>滑縣 |
| 8 | 河南省>信陽市>固始縣 |
| 10 | 河南省>信陽市>息縣 |
| 16 | 河南省>南陽市>方城縣 |
| 18 | 河南省>駐馬店市>正陽縣 |
| 4 | 河南省>信陽市>淮濱縣>蘆集鄉 |
| 7 | 河南省>安陽市>滑縣>老廟鄉 |
| 9 | 河南省>信陽市>固始縣>李店鄉 |
| 11 | 河南省>信陽市>息縣>關店鄉 |
| 12 | 河南省>信陽市>淮濱縣>鄧灣鄉 |
| 13 | 河南省>信陽市>淮濱縣>臺頭鄉 |
| 14 | 河南省>信陽市>淮濱縣>谷堆鄉 |
+------+-----------------------------------------+
完整原理你們能夠參考https://mariadb.com/kb/en/library/recursive-common-table-expressions-overview/。