有没有有效的方法,在不限制深度的情况下,根据节点的ID检索邻接列表模型中的单个路径?就像我有一个名为“Banana”的节点的ID一样,我可以得到以下路径:Food>水果>香蕉
如果它不可能,这不是一个大问题,但我想过是否可以通过while循环或其他东西运行连接?直到父母变为0。
答案 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/