递归自我查询

时间:2010-07-18 15:36:04

标签: mysql parent-child self-join

我有下表:

myTable:
+----+----------+
| id | parentID |
+----+----------+
|  1 |     null |
|  2 |        1 |
|  3 |        1 |
|  4 |        2 |
|  5 |        4 |
-----------------

我希望所有行都可以追溯,直到没有parentID为止。 所以“...... WHERE id = 5”会给我:

5, 4, 2, 1

1 个答案:

答案 0 :(得分:9)

您正在使用adjacency list model整理分层数据。事实上,这种递归操作很困难,这实际上是该模型的一个主要缺点。

某些DBMS(如SQL Server 2005,Postgres 8.4和Oracle 11g)支持使用common table expressions WITH关键字进行递归查询。

对于MySQL,您可能有兴趣查看以下描述替代模型(nested set model)的文章,这使得递归操作更容易(可能):

此外,我还建议查看上面评论中指出的Bill Karwin's presentation。所描述的闭包表模型是嵌套集的非常有效的替代方法。