PHP / MySQL:在Adjacency List模型中检索单个路径

时间:2010-09-02 14:05:08

标签: php mysql path adjacency-list

有没有有效的方法,在不限制深度的情况下,根据节点的ID检索邻接列表模型中的单个路径?就像我有一个名为“Banana”的节点的ID一样,我可以得到以下路径:Food>水果>香蕉

如果它不可能,这不是一个大问题,但我想过是否可以通过while循环或其他东西运行连接?直到父母变为0。

3 个答案:

答案 0 :(得分:2)

不,至少在MySQL中没有。这是Adjacency List Model的最大限制之一。

你可以继续自我加入有限次数,但那是丑陋的,尴尬的并且不包括无限的部门。您还可以下载应用程序中的所有数据,构建树,并在应用程序中查找路径。

某些DBMS(如SQL Server 2005,Postgres 8.4和Oracle 11g)支持使用common table expressions WITH关键字进行递归查询。此功能允许轻松编写此类查询,但遗憾的是MySQL尚不支持递归查询。

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

此外,我还建议在Stack Overflow的常规撰稿人@Bill Karwin上查看以下演示文稿:

演示文稿中描述的闭包表模型是嵌套集的非常有效的替代方法。他在SQL Antipatterns书(excerpt from the chapter on this topic)中详细描述了这个模型。

答案 1 :(得分:1)

尝试此查询:

SET @id:=12345;

SELECT content_name, content_id, (@id:=content_parent) as content_parent 
FROM 
    ( SELECT content_id, content_name, content_id, content_parent 
      FROM content_table 
      ORDER BY content_parent DESC
    ) AS aux_table 
    WHERE content_id = @id

答案 2 :(得分:0)

不,MySQL没有PostgreSQL,Oracle或SQL Server等递归查询。使用MySQL时,邻接列表模型不是一个很好的模型,嵌套集是一个更好(但更复杂)的模型。

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/