是否有任何有效的方法可以在不限制深度的情况下根据节点的 ID 在邻接列表模型中检索单个路径?就像我有一个名为“香蕉”的节点的 ID,我可以获得以下路径:食物 > 水果 > 香蕉
如果不可能的话,这不是一个大问题,但我想是否可以通过 while 循环或其他方式运行连接?直到父母变成0。
是否有任何有效的方法可以在不限制深度的情况下根据节点的 ID 在邻接列表模型中检索单个路径?就像我有一个名为“香蕉”的节点的 ID,我可以获得以下路径:食物 > 水果 > 香蕉
如果不可能的话,这不是一个大问题,但我想是否可以通过 while 循环或其他方式运行连接?直到父母变成0。
不,至少在 MySQL 中没有。这是邻接列表模型的最大限制之一。
您可以继续进行有限次数的自我加入,但这很丑陋、尴尬并且不包括无限的部门。您还可以下载应用程序中的所有数据,构建树并在应用程序中查找路径。
一些 DBMS,例如 SQL Server 2005、Postgres 8.4 和 Oracle 11g,支持使用带有关键字的公共表表达式的递归查询。WITH
此功能允许轻松编写此类查询,但不幸的是 MySQL 尚不支持递归查询。
您可能有兴趣查看以下描述替代模型(嵌套集模型)的文章,它使 MySQL 中的递归操作更容易(可能):
此外,我还建议查看@Bill Karwin的以下演示文稿,他是 Stack Overflow 的定期撰稿人:
演示文稿中描述的闭包表模型是嵌套集的非常有效的替代方案。他在他的SQL Antipatterns一书中更详细地描述了这个模型(摘自关于这个主题的章节)。
试试这个查询:
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
不,MySQL 没有像 PostgreSQL、Oracle 或 SQL Server 这样的递归查询。使用 MySQL 时,邻接表模型不是一个很好的模型,嵌套集是一个更好(但更复杂)的模型。
http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/