我有一个包含这些字段的MySQL表格(id
,parentID
,name
,content
)。
页面层次结构为:
- About Us - History - 2000 - 2001
如果我在“2001”页面上,如何创建查询以查找此页面的顶级祖先是“关于我们”?
答案 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)
只要您知道层次结构中的深度级别,就可以构建子查询以找到返回顶部的方式。