我需要一个MySQL查询,它将一个节点及其所有子节点移动到一个嵌套集中.我发现这个网站,但该功能似乎只是如此不合逻辑-没有universeid或treeid嵌套集模型,代码本身只是感觉比什么需要更长的时间.我在表中唯一的额外列是parent.
我不能再删除并添加节点,因为它将丢失其ID.
我有一个复杂的嵌套对象层次结构,所有子对象(存储在父类中的对象数组)包含一个链接回其父级的属性:相当简单和直接,没有实际问题.如果我对层次结构中的任何对象执行var_dump,我将在转储中获得递归引用,正如我所期望的那样.
FIRSTGEN
_children array of objects of type SECONDGEN
SECONDGEN #1
_parent object of type FIRSTGEN
_children array of objects of type THIRDGEN
THIRDGEN #1
_parent object of type SECONDGEN
THIRDGEN #2
_parent object of type SECONDGEN
SECONDGEN #2
_parent object of type FIRSTGEN
_children array of objects of type THIRDGEN
THIRDGEN #3
_parent object of type SECONDGEN
Run Code Online (Sandbox Code Playgroud)
我最近在该层次结构中添加了一些新元素,但它们并没有遵循相同的模式.它们存储在顶级父级的对象数组中,但包含一个属性,将它们链接回来,而不是它们的父级,而是一个兄弟级.当我现在执行var_dump时,我得到一个"致命错误:嵌套级别太深 - 递归依赖?".
FIRSTGEN
_children_1 array of objects of type SECONDGEN_1
SECONDGEN_1 #1
_parent object of type FIRSTGEN
_children array of objects …Run Code Online (Sandbox Code Playgroud) 对于简单的数据结构,例如:
ID parentID Text Price
1 Root
2 1 Flowers
3 1 Electro
4 2 Rose 10
5 2 Violet 5
6 4 Red Rose 12
7 3 Television 100
8 3 Radio 70
9 8 Webradio 90
Run Code Online (Sandbox Code Playgroud)
作为参考,层次结构树如下所示:
ID Text Price
1 Root
|2 Flowers
|-4 Rose 10
| |-6 Red Rose 12
|-5 Violet 5
|3 Electro
|-7 Television 100
|-8 Radio 70
|-9 Webradio 90
Run Code Online (Sandbox Code Playgroud)
我想计算每个级别的孩子数量.所以我会得到一个新的专栏"NoOfChildren",如下所示:
ID parentID Text Price NoOfChildren
1 Root 8
2 1 Flowers …Run Code Online (Sandbox Code Playgroud) 我必须构建一个包含大约300个节点的树.树没有深度限制.所以它可以有3或15个级别.每个节点可以拥有无限数量的孩子.
优先级是尽可能快地获得完整的树/子树,但我还需要添加节点或移动节点,但有时不需要.
我想知道在数据库中存储树的最佳方法,以及在php中检索数据的最佳方法(如果可能的话).
对于项目,我需要以交互方式更改可视化的分层数据布局 - 无需任何基础数据的任何更改.能够在它们之间切换的布局应该是树,簇,径向树和径向簇.转换应该最好是动画.
我认为这将是相对容易的任务D3.我开始了,但是我在翻译和轮换,数据绑定等方面迷失了,所以我向你寻求帮助.此外,我可能正在做的不是D3的精神,这是不好的,因为我正在寻求一个干净的解决方案.
我把一个jsfidle放在一起,但它只是一个起点,增加了单选按钮,方便的小数据集和初始集群布局 - 只是为了帮助任何想看看它的人.提前致谢!
更新:
我只想专注于链接,所以我暂时禁用其他元素.在@AmeliaBR方法的基础上,获得以下动画:

这是更新的jsfiddle.
更新2:
现在用圈子:(原谅我选择的颜色)
{末日毒霸-末日}

我正在尝试将涉及Oracle SYS_CONNECT_BY_PATH语法的复杂查询转换为SQL Server:
SELECT
DISTINCT TO_CHAR(CONCAT(@ROOT, SYS_CONNECT_BY_PATH(CONCAT('C_',X), '.'))) AS X_ALIAS
, TO_CHAR(CONCAT(@ROOT, PRIOR SYS_CONNECT_BY_PATH(CONCAT('C_',X), '.'))) AS X_ALIAS_FATHER
, TO_CHAR(X) AS X_ALIAS_LEAF
, LEVEL AS LVL
FROM MY_TABLE
LEFT JOIN MY_TABLE_BIS MY_TABLE_BIS_ALIAS ON MY_TABLE_BIS_ALIAS.MY_ID = COL_X
LEFT JOIN OTHER_TABLE
ON OTHER_TABLE.MY_ID = COL_X
CONNECT BY (PRIOR ID_SON = ID_FATHER)
AND LEVEL <= MAXDEPTH
START WITH ID_FATHER
IN (SELECT AN_ID AS ID_FATHER FROM BIG_TABLE)
Run Code Online (Sandbox Code Playgroud)
这是我使用本网站获得的
WITH n(LEVEL, X_ALIAS, X_ALIAS_FATHER, X_ALIAS_LEAF) AS
( SELECT 1, CONCAT('C_',X), CONCAT('C_',X), CAST(X AS VARCHAR(30))
FROM …Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的文本文件:
{ Id = 1, ParentId = 0, Position = 0, Title = "root" }
{ Id = 2, ParentId = 1, Position = 0, Title = "child 1" }
{ Id = 3, ParentId = 1, Position = 1, Title = "child 2" }
{ Id = 4, ParentId = 1, Position = 2, Title = "child 3" }
{ Id = 5, ParentId = 4, Position = 0, Title = "grandchild 1" }
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种通用的C#算法,它将从中创建一个对象层次结构.如果您愿意,可以使用"层次结构"功能将此数据转换为对象层次结构.
有任何想法吗?
编辑我已经将文件解析为.NET对象:
class …Run Code Online (Sandbox Code Playgroud) 我必须在数据库中存储一棵树,那么最好的方法是什么?显示您使用的方法并命名其优缺点.(我使用的是SQL Server 2005)
我有一个有3列的表:
ID, PARENT_ID, NAME
Run Code Online (Sandbox Code Playgroud)
PARENT_IDID在同一个表中具有外键关系.该表正在为层次结构建模.
有时ID记录会改变.我希望能够更新记录ID,然后更新依赖记录' PARENT_ID以指向新记录ID.
问题是,当我尝试更新ID记录时,它会破坏完整性并立即失败.
我意识到我可以使用new插入一个新记录ID,然后更新子项,然后删除旧记录,但是我们有很多触发器,如果我这样做会搞砸.
有没有办法暂时更新父级,承诺更新子级(显然它会在提交时失败)而不会短暂禁用外键?
我有一个使用Closure Table方法保存分层数据的MySQL数据库.一个简单的示例数据库创建脚本遵循该问题.我目前的问题是如何以正确的顺序从数据库中提取数据?我目前正在使用以下select语句.
SELECT `TreeData`.`iD`, `TreeData`.`subsectionOf`,
CONCAT(REPEAT('-', `TreePaths`.`len`),`TreeData`.`name`),
`TreePaths`.`len`,`TreePaths`.`ancestor`,`TreePaths`.`descendant`
FROM `TreeData`
LEFT JOIN `TreePaths` ON `TreeData`.`iD` = `TreePaths`.`descendant`
WHERE `TreePaths`.`ancestor` = 1
ORDER BY `TreeData`.`subsectionOrder`
Run Code Online (Sandbox Code Playgroud)
它会提取正确的信息,但输入顺序不正确.
示例数据库使用示例数据创建脚本.
-- Simple Sample
SET FOREIGN_KEY_CHECKS=0;
DROP TRIGGER IF EXISTS Tree_Insert;
DROP TRIGGER IF EXISTS Tree_Update;
DROP TABLE IF EXISTS TreePaths;
DROP TABLE IF EXISTS TreeData;
SET FOREIGN_KEY_CHECKS=1;
CREATE TABLE `TreeData` (
`iD` INT NOT NULL, -- PK
`subsectionOf` INT, -- Parent ID & FK
`subsectionOrder` INT, -- Oder of Subsections
`name` NVARCHAR(500) NOT NULL, …Run Code Online (Sandbox Code Playgroud) hierarchy ×3
mysql ×3
sql ×3
sql-server ×3
php ×2
t-sql ×2
tree ×2
algorithm ×1
c# ×1
d3.js ×1
dendrogram ×1
hierarchical ×1
nested-sets ×1
oop ×1
oracle ×1
recursion ×1