我需要一个MySQL查询,它将一个节点及其所有子节点移动到一个嵌套集中.我发现这个网站,但该功能似乎只是如此不合逻辑-没有universeid或treeid嵌套集模型,代码本身只是感觉比什么需要更长的时间.我在表中唯一的额外列是parent.
我不能再删除并添加节点,因为它将丢失其ID.
我试图将我的数据分层设置为树遍历模型到<ul>,以便在我的网站上显示.
这是我的代码:
function getCats($) {
// retrieve all children of $parent
$query = "SELECT max(rght) as max from t_categories";
$row = C_DB::fetchSingleRow($query);
$max = $row["max"];
$result ="<ul>";
$query = "SELECT * from t_categories where lft >=0 and rght <= $max";
if($rs = C_DB::fetchRecordset($query)){
$p_right ="";
$p_left ="";
$p_diff="";
while($row = C_DB::fetchRow($rs)){
$diff = $row["rght"] -$row["lft"];
if($diff == $p_diff){
$result.= "<li>".$row['title']."</li>";
}elseif (($row["rght"] - $row["lft"] > 1) && ($row["rght"] > $p_right)){
$result. "<ul>";
$result.= "<li>".$row['title']."</li>";
}else{
$result.= "<li>".$row['title']."</li>";
}
$p_right = …Run Code Online (Sandbox Code Playgroud) 我花了最后几个小时试图在线找到这个问题的解决方案.我已经找到了很多关于如何从嵌套集转换为邻接的例子......但很少有相反的方法.我发现的示例要么不起作用,要么使用MySQL程序.不幸的是,我无法使用此项目的程序.我需要一个纯PHP解决方案.
我有一个使用下面的邻接模型的表:
id parent_id category
1 0 Books
2 0 CD's
3 0 Magazines
4 1 Books/Hardcover
5 1 Books/Large Format
6 3 Magazines/Vintage
Run Code Online (Sandbox Code Playgroud)
我想将它转换为下面的嵌套集:
id left right category
0 1 14 Root Node
1 2 7 Books
4 3 4 Books/Hardcover
5 5 6 Books/Large Format
2 8 9 CD's
3 10 13 Magazines
6 11 12 Magazines/Vintage
Run Code Online (Sandbox Code Playgroud)
这是我需要的图像:

我有一个函数,基于此论坛帖子的伪代码(http://www.sitepoint.com/forums/showthread.php?t=320444),但它不起作用.我得到多个具有相同左侧值的行.这不应该发生.
<?php
/**
--
-- Table structure for table `adjacent_table`
--
CREATE TABLE IF NOT EXISTS `adjacent_table` ( …Run Code Online (Sandbox Code Playgroud) 我有一个层次结构中的项目列表,我正在尝试将此列表解析为实际的对象层次结构.我正在使用修改的预订树遍历来存储/遍历此列表,因此我所拥有的是树的子集,包括所有子节点,按其"左"值排序.
例如,给定树:
我得到了清单:
(这是来自修改的预订树设置的"左"值的顺序).
我想要做的是将其解析为包含树的实际结构的对象,例如:
Class TreeObject {
String Name;
Guid ID;
Guid ParentID;
List<TreeObject> Children;
}
Run Code Online (Sandbox Code Playgroud)
平面列表作为TreeObjects列表返回 - 每个TreeObject都具有ID,ParentID,Left和Right属性.我正在寻找的是一个功能:
List<TreeObject> FlatToHeirarchy(List<TreeObject> list);
Run Code Online (Sandbox Code Playgroud)
获取平面列表,并返回嵌套列表.
换一种说法:
List<TreeObject> flatSet = LoadTreeObjectsFromDatabase();
// flatSet.count == 7; flatSet(0).Children == null
List<TreeObject> nestedSet = FlatToHeirarchy(flatSet);
// nestedSet.count == 3; nestedSet(0).Children.count == 2
Run Code Online (Sandbox Code Playgroud)
我不知道如何做到这一点 - 跟踪父母,并能够处理更大的跳跃(例如,项目A.2.2 - >项目B).
编辑:我在这里寻找一个非暴力解决方案(例如,不循环几次,将项目移动到子节点,直到只剩下顶级父级).我猜测有一个优雅的方法可以循环一次,只需根据需要放置项目.
请记住,它们总是处于层级顺序(因为我正在使用MPTT),因此给定项目将始终是前一项目的子项或兄弟项目,或者至少与前一项目共享父项.它永远不会来到树的其他地方.
我存储在MySQL的超过10万条记录使用MPTT树lft,rght和parent_id列.现在左/右值已损坏,而父ID仍然完好无损.它需要大量的查询才能在应用程序层中修复它.是否有一种很好的方法来减轻数据库的负担并让它仅使用SQL重新计算左/右值?
为了澄清,我需要重新计算嵌套集的数值lft/rght值,而不是相邻记录的id.
嵌套集http://dev.mysql.com/tech-resources/articles/hierarchical-data-4.png
我需要在用户定义的层次结构中构建一个用于存储"类别"(我想不出更好的词)的新系统.由于嵌套集模型针对读取而不是写入进行了优化,因此我决定使用它.不幸的是,在我研究和测试嵌套集时,我遇到了如何显示带有排序节点的分层树的问题.例如,如果我有层次结构:
root
finances
budgeting
fy08
projects
research
fabrication
release
trash
Run Code Online (Sandbox Code Playgroud)
我希望对它进行排序,使其显示为:
root
finances
budgeting
fy08
projects
fabrication
release
research
trash
Run Code Online (Sandbox Code Playgroud)
请注意,制作在研究之前出现.
无论如何,经过长时间的搜索,我看到了诸如"将树存储在一个多维数组中并对其进行排序"和"求助树并序列化回嵌套集模型"的答案(我正在解释......).无论哪种方式,第一个解决方案是RAM和CPU的可怕浪费,这两者都是非常有限的资源......第二个解决方案看起来像很多痛苦的代码.
无论如何,我能够弄清楚如何(使用嵌套集模型):
所以我认为#5和#6可用于进行我想要的排序,它也可以用于按排序顺序重建树.
但是,现在我已经了解了所有这些我学会了做的事情,我看到#3,#5和#6可以一起用来执行排序插入.如果我做了排序插入,它总是被排序.但是,如果我改变排序标准或者我想要一个不同的排序顺序,我就会回到原点.
这可能只是嵌套集模型的限制吗?它的使用是否会抑制输出的查询排序?
在Joe Celko的嵌套集(修改的预订遍历)的已知限制中,随着树变大到大,性能上的标记会降低.
Vadim Tropashko提出了嵌套区间,并在本文中提供了示例和理论解释:http://arxiv.org/html/cs.DB/0401014
这是一个可行的解决方案,是否有任何可行的示例(使用任何语言)从原生数据库层抽象出来?
简短问题:如何管理出现在多个类别下的产品类别?完全这样做是不好的做法?
背景信息: 我们有一个产品数据库,其类别如下:
Products
-Arts and Crafts Supplies
-Glue
-Paper Clips
-Construction Paper
-Office Supplies
-Glue
-Paper Clips
Run Code Online (Sandbox Code Playgroud)
请注意,胶水和纸夹分配给两个类别.虽然它们出现在此类别树中的两个不同位置,但它们在数据库中具有相同的类别ID.为什么?两个原因:
这允许我们管理单个类别及其属性和分配的产品,但将其放置在类别树中的多个位置.
我们使用的是嵌套集模型,因此我们用来支持它的db结构是:
Category
----------
CategoryID
CategoryName
CategoryTree
------------
CategoryTreeID
CategoryID
Lft
Rgt
Run Code Online (Sandbox Code Playgroud)
因此,Category和CategoryTree之间存在1:M,因为类别树中可能存在给定类别的多个实例.
有没有更简单的方法来模拟这个允许产品类别显示在多个类别下?
我使用以下列运行了mill嵌套集层次结构类型设置:
表名:
myset
Run Code Online (Sandbox Code Playgroud)
列:
id, name, lft, rgt
Run Code Online (Sandbox Code Playgroud)
有没有人知道查询来确定节点的父节点?
我读了几个地方,在你的表中有一个parent_id列来跟踪这个很方便,但它似乎是多余的,如果在添加/时查询被错误地执行,它似乎可能与嵌套集不同步移除/移动集合中的任何内容.