标签: hierarchy

从自引用表中获取层次结构数据

假设你有下表:

items(item_id, item_parent)  
Run Code Online (Sandbox Code Playgroud)

......它是一个自引用表 - item_parent指的是item_id.

您将使用什么SQL查询来选择表中的所有项以及它们的深度,其中项的深度是该项的所有父项和父项的总和.

如果以下是表的内容:

item_id     item_parent
----------- -----------
1           0          
2           0            
3           2          
4           2          
5           3          
Run Code Online (Sandbox Code Playgroud)

...查询应检索以下对象集:

{"item_id":1,"深度":0}
{"item_id":2,"深度":0}
{"item_id":3,"深度":1}
{"item_id":4,"深度": 1}
{"item_id":5,"深度":2}

PS我正在寻找MySQL支持的方法.

mysql sql recursion hierarchy

22
推荐指数
2
解决办法
2万
查看次数

计算分层SQL数据中的子项数

对于简单的数据结构,例如:

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)

sql sql-server hierarchy hierarchical-data

21
推荐指数
2
解决办法
1万
查看次数

让所有父母为孩子

我想检索一个id的parentid,如果那个parentid有一个父母再次检索它,依此类推.一种层次表.

id----parentid
1-----1
5-----1
47894--5
47897--47894
Run Code Online (Sandbox Code Playgroud)

我是sql server的新手并试过,有些查询如下:

with name_tree as 
(
   select id, parentid
   from Users
   where id = 47897 -- this is the starting point you want in your recursion
   union all
   select c.id, c.parentid
   from users c
   join name_tree p on p.id = c.parentid  -- this is the recursion
) 
select *
from name_tree;
Run Code Online (Sandbox Code Playgroud)

它只给我一排.我还想将这些记录插入临时表变量中.我怎样才能做到这一点.提前致谢.很抱歉问这个简单的问题(虽然不是我)

t-sql sql-server recursion hierarchy recursive-cte

21
推荐指数
1
解决办法
2万
查看次数

从父/子的平面列表构建层次结构对象

我有一个层次结构中的项目列表,我正在尝试将此列表解析为实际的对象层次结构.我正在使用修改的预订树遍历来存储/遍历此列表,因此我所拥有的是树的子集,包括所有子节点,按其"左"值排序.

例如,给定树:

  • 项目A.
    • 项目A.1
    • 项目A.2
      • 项目A.2.2
  • 项目B.
    • 项目B.1
  • 项目C.

我得到了清单:

  • 项目A,项目A.1,项目A.2,项目A.2.2,项目B,项目B.1,项目C.

(这是来自修改的预订树设置的"左"值的顺序).

我想要做的是将其解析为包含树的实际结构的对象,例如:

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),因此给定项目将始终是前一项目的子项或兄弟项目,或者至少与前一项目共享父项.它永远不会来到树的其他地方.

.net hierarchy mptt nested-sets

20
推荐指数
1
解决办法
2万
查看次数

LINQ基于childorder对单个列表进行排序

我目前正试图找出一种用LINQ和C#对我的元素进行排序的好方法,但我有点没有这样做.

对于这个问题,我们假设您有以下表格

---TempTable
ID (int)
ParentID (int)
Name (varchar)
SortOrder (int)
Run Code Online (Sandbox Code Playgroud)

ID和ParentID彼此相关,并给我一个自我分层的数据结构.根元素在ID字段中为空.SortOrder只是整个表的一部分,并且基于ParentID,因此共享相同ParentID的元素中包含1,2,3.

让我们进一步假设以下数据:

ID = 1
ParentID = null
Name = Test 1
SortOrder = 1

ID = 2
ParentID = 1
Name = Test 2
SortOrder = 1

ID = 3
ParentID = 1
Name = Test 3
SortOrder = 2

ID = 4
ParentID = 2
Name = Test 4
SortOrder = 1
Run Code Online (Sandbox Code Playgroud)

我想要的平面列表应该具有以下顺序:

Test 1 //root element with sort order 1 = very top
Test 2 //child …
Run Code Online (Sandbox Code Playgroud)

c# linq entity-framework hierarchy

20
推荐指数
1
解决办法
3808
查看次数

如何使用枚举与分组和子组层次结构/嵌套

我有一个enumExample"如下"的"班级" :

enum Example {
//enums belonging to group A:
   enumA1,
   enumA2,
   enumA3,
//enums belonging to group B:
   enumB1,
   enumB2,
   enumB3,
//enums belonging to group C:
   enumC1,
   enumC2,
   enumC3;
}
Run Code Online (Sandbox Code Playgroud)

对我的项目来说,重要的是他们所使用的所有枚举都属于Example(因为这是类的构造函数中的参数).

如何使用enum层次结构/嵌套来实现以下目标:

  • 测试是否属于enumA,B或C组的方法.例如,类似于Example.enumA1.isGroupBelonging(Group.A)isGroupBelonging(Example.enumA1,Group.A)将是返回true的公共方法.

  • 能够对组的子组做同样的事情A,B并且C.例如,组A可能有子组a,bc.然后我想要一个方法,做一些像Example.enumA1.isSubGroupBelonging(SubGroup.a)这样的东西public boolean.

  • 一种方法来完成所有这些,而不需要一些精心设计的enum名称堵塞我的代码.例如,能够Example.enumA1在我的其他类中引用而不需要使用类似Example.enumA1(Group.A,SubGroup.a)或类似的东西来引用它将是很好的Example.enumA1.Group.A.SubGroup.a

java enums grouping nested hierarchy

20
推荐指数
2
解决办法
2万
查看次数

树,集群,径向树和径向集群布局之间的平滑过渡

对于项目,我需要以交互方式更改可视化的分层数据布局 - 无需任何基础数据的任何更改.能够在它们之间切换的布局应该是树,簇,径向树和径向簇.转换应该最好是动画.

我认为这将是相对容易的任务D3.我开始了,但是我在翻译和轮换,数据绑定等方面迷失了,所以我向你寻求帮助.此外,我可能正在做的不是D3的精神,这是不好的,因为我正在寻求一个干净的解决方案.

我把一个jsfidle放在一起,但它只是一个起点,增加了单选按钮,方便的小数据集和初始集群布局 - 只是为了帮助任何想看看它的人.提前致谢!

更新:

我只想专注于链接,所以我暂时禁用其他元素.在@AmeliaBR方法的基础上,获得以下动画:

在此输入图像描述

这是更新的jsfiddle.

更新2:

现在用圈子:(原谅我选择的颜色)

{末日毒霸-末日}

在此输入图像描述

这是一个更新的jsfiddle.

hierarchy dendrogram hierarchical-data d3.js

20
推荐指数
2
解决办法
8579
查看次数

用于生成层次结构的C#算法

我有一个看起来像这样的文本文件:

{ 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)

c# algorithm hierarchy hierarchical-data

19
推荐指数
2
解决办法
2万
查看次数

在C++中重命名命名空间的一致方法

使用嵌套命名空间时,有时完全限定名称最终会很长.我知道我可以用它namespace abc = aaa::bbb::ccc来减少打字量(在某些情况下它也可以提高可读性).

但是,我不确定在项目中的所有文件中实现此重命名的最佳方法是什么.直接的方法(即,在每次使用的基础上重命名长命名空间)可能导致最终在不同文件中为相同的完全限定名称使用不同的短名称.所以,我正在考虑采用更一致的方式来做到这一点.

例如,让我们假设:

project
  |- client
  |   |- core
  |   |- plugin
  |   |- util
  |- server
      ...
Run Code Online (Sandbox Code Playgroud)

我想为每个目录创建一个包含简化名称的标题.例如,project/client/core/core.h将包含namespace pr_cl_core = project::client::core(我知道这个短名称的例子相当差,但在实际项目中他们更有意义).然后,我将包含core.h在所有头文件中,project/client/core以便当包含该目录中的头时,比方说,project/client/plugin/plugin_foo.h短命名空间版本随时可用.

这是一个很好的方法吗?还有其他更好的方法吗?

我在SO上找到了几个关于C++命名空间的问题(例如,12),但它们都没有涉及如何以项目范围的方式解决命名空间重命名问题.

编辑:此外,这种机制可用于系统地重命名整个项目的长名称空间(如Boost的名称空间).例如,我通常重命名一些名称空间,如:

namespace ip = boost::asio::ip;
namespace ptime = boost::posix_time;
Run Code Online (Sandbox Code Playgroud)

目前我是按翻译单位进行的,但我希望使用全局方法来完成整个项目.

c++ namespaces hierarchy

19
推荐指数
1
解决办法
1746
查看次数

使用Autofixture将子实例上的属性值设置为固定值

在使用Autofixture构建父级时,是否可以为子实例上的属性分配固定值?它会将默认值添加到子实例上的所有属性(如charm),但我想覆盖并为子实例上的某个属性指定特定值.

鉴于这种父/子关系:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public Address Address { get; set; }
}

public class Address
{
    public string Street { get; set; }
    public int Number { get; set; }
    public string City { get; set; }
    public string PostalCode { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想在地址实例上为City属性分配一个特定值.我正在考虑这个测试代码:

var fixture = new Fixture();

var expectedCity = "foo";

var person = fixture
    .Build<Person>()
    .With(x => x.Address.City, expectedCity) …
Run Code Online (Sandbox Code Playgroud)

c# hierarchy autofixture

19
推荐指数
2
解决办法
5529
查看次数