2

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

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

4

3 回答 3

2

不,至少在 MySQL 中没有。这是邻接列表模型的最大限制之一。

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

一些 DBMS,例如 SQL Server 2005、Postgres 8.4 和 Oracle 11g,支持使用带有关键字的公共表表达式的递归查询。WITH此功能允许轻松编写此类查询,但不幸的是 MySQL 尚不支持递归查询。

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

此外,我还建议查看@Bill Karwin的以下演示文稿,他是 Stack Overflow 的定期撰稿人:

演示文稿中描述的闭包表模型是嵌套集的非常有效的替代方案。他在他的SQL Antipatterns一书中更详细地描述了这个模型(摘自关于这个主题的章节)。

于 2010-09-02T14:08:54.677 回答
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
于 2013-03-24T08:28:29.013 回答
1

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

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

于 2010-09-02T14:11:02.130 回答