我正在使用嵌套集模型与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的解决方案(或部分解决方案)。
谢谢
答案 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;