嵌套集模型:查询节点子节点仅低于1级以及所有父节点

时间:2011-09-28 11:10:00

标签: php mysql sql

我正在使用嵌套集模型与MySQL来创建分层树模型。

我已成功设法将Node及其所有Childs 1级下面(我只需要获得1个子级别)

但是,我希望不仅有所有Childs 1级以下,而且还有所有在该Node之上的Parent。

是否可以修改当前查询以获得我想要的内容?

这是我的代码(实际上它取自这个非工作的网站:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/,但我的代码完全相同):

SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth
FROM nested_category AS node,
nested_category AS parent,
nested_category AS sub_parent,
(
    SELECT node.name, (COUNT(parent.name) - 1) AS depth
    FROM nested_category AS node,
    nested_category AS parent
    WHERE node.lft BETWEEN parent.lft AND parent.rgt
    AND node.name = 'PORTABLE ELECTRONICS'
    GROUP BY node.name
    ORDER BY node.lft
)AS sub_tree
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
AND sub_parent.name = sub_tree.name
GROUP BY node.name
HAVING depth <= 1
ORDER BY node.lft;

树结构如下所示:

Electronics
--Televisions
----LCD
--Portable Electronics
----MP3 Players
------Flash
----CD Players

使用我上面的当前代码,我明白了:

--Portable Electronics
----MP3 Players

但我需要得到这样的东西:

Electronics
--Portable Electronics
----MP3 Players

稍后我将在PHP中使用此查询,因此我也可以使用基于PHP的解决方案(或部分解决方案)。

谢谢

3 个答案:

答案 0 :(得分:0)

我想你想在多个查询中拆分它。首先是'PORTABLE ELECTRONICS'项目及其所有孩子,就像你现在正在做的那样。之后,获取父项很简单,只需获取所有元素WHERE left < [PE-left] AND right > [PE-right]

答案 1 :(得分:0)

我设法通过使用多个查询来解决问题。

第一个查询检索节点上方的所有父节点(如Rijk建议的那样),第二个查询检索节点下面的所有内容(代码,在原始帖子中发布)。然后使用UNION ALL将所有内容合并到一个结果集中。

但是我不能再使用深度列来进行缩进,所以为了对子进行页面格式化,我使用基于php的函数来缩进节点(http://www.sitepoint.com/hierarchical-data-database-2/

注意:我必须在此代码末尾添加if / else语句以仅缩进父节点,而不是缩进所有内容。

答案 2 :(得分:0)

我有同样的问题。这似乎有效。

SELECT parent.name
FROM nested_category AS node,nested_category AS parent,nested_category AS midpoint
WHERE (node.lft BETWEEN parent.lft AND parent.rgt) AND (node.lft BETWEEN midpoint.lft AND midpoint.rgt) AND midpoint.name='PORTABLE ELECTRONICS'
GROUP BY parent.name
ORDER BY node.lft;