MySQL查询页面祖先

时间:2011-06-21 01:20:38

标签: mysql

我有一个包含这些字段的MySQL表格(idparentIDnamecontent)。

页面层次结构为:

 - About Us 
   - History 
     - 2000
     - 2001

如果我在“2001”页面上,如何创建查询以查找此页面的顶级祖先是“关于我们”?

4 个答案:

答案 0 :(得分:1)

重新设计表格后,请按照Nested Sets模式进行查询,

SELECT parent.name
FROM pages AS node,
pages  AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.name = '2001'
ORDER BY parent.lft
LIMIT 1

会给你“关于我们”

如果您只允许特定级别的嵌套,您可以执行一系列左连接,如该页面上显示的示例:

SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
WHERE t4.name = 'FLASH';

但是如果你想支持嵌套到任意深度,嵌套集就是城里唯一的游戏。花点时间阅读整页。它可能比你希望的更多参与,但是一旦你看到它是如何工作的,它就会非常强大。

答案 1 :(得分:0)

SELECT c.id, c.name, c.content, (SELECT p.name FROM table2 as p WHERE p.id = c.parentID) AS parent FROM table1 as c;

或使用parentID上的联接。

答案 2 :(得分:0)

您可以使用类似以下伪代码的方式以递归方式执行此操作。

GetParent(current_id)
  get tuple from mysql with id = current_id
  If parentId = 0
    Return tuple (we are at top)
  Else 
    Return GetParent(parentId)

答案 3 :(得分:0)

我假设'2001'页面的父级ID是5。

SELECT name FROM page_table WHERE id =(SELECT parentID FROM page_table WHERE id = 5)

只要您知道层次结构中的深度级别,就可以构建子查询以找到返回顶部的方式。