首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySql闭合表不支持不同父级的重复子类别

MySql闭合表不支持不同父级的重复子类别
EN

Stack Overflow用户
提问于 2012-08-21 06:45:48
回答 1查看 740关注 0票数 1

我已经用这个闭合表转了一段时间了。我遇到的问题是第二次出现后代。我有出现在多个父类别中的子类别的实例。为了简单起见,我回到了这个例子:

代码语言:javascript
复制
drop table if exists closure;
drop table if exists nodes;

create table nodes (
node int auto_increment primary key,
label varchar(20) not null
);

insert into nodes (node, label) values
(1, 'rootree'),
(2, '1stbranch'),
(3, 'midbranch'),
(4, 'corebranch'),
(5, 'leafnodes'),
(6, 'lastbranch'),
(7, 'lastleaf');

create table closure (
ancestor int not null,
descendant int not null,
primary key (ancestor, descendant),
foreign key (ancestor) references nodes(node),
foreign key (descendant) references nodes(node)
);

insert into closure (ancestor, descendant) values
(1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7),
(2,2),
(3,3), (3,4), (3,5),
(4,4), (4,5),
(5,5),
(6,6), (6,7),
(7,7);

使用下面的查询,我可以得到想要的结果:

代码语言:javascript
复制
select group_concat(n.label order by n.node separator ' -> ') as path
from closure d
join closure a on (a.descendant = d.descendant)
join nodes n on (n.node = a.ancestor)
where d.ancestor = 1 and d.descendant != d.ancestor
group by d.descendant;

结果:

代码语言:javascript
复制
rootree -> 1stbranch
rootree -> midbranch
rootree -> midbranch -> corebranch
rootree -> midbranch -> corebranch -> leafnodes
rootree -> lastbranch
rootree -> lastbranch -> lastleaf

但是如果我添加另一个子节点,一个已经存在的子节点,例如,我想让叶子节点成为roottree lastbranch -> ->的子节点。

我在闭合表中插入了两条新记录:(6-5)和(7-5)

然后所有的地狱都解脱了。我已经试过我能想到的所有方法了,但我什么也没做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-23 20:31:51

我在这里找到了答案:Converting the Closure Table from a Weak Entity

回答:我在闭合表中添加了两个字段来保存祖先和后代的id。现在节点独立于实际值。该结构保持连接,用于插入、删除、查询等,但保留在每个节点的值是它们自己的实体,可以由任何其他实体替换,而不会影响树的结构。这使我能够解决我的特定问题,即在多个父类别中使用相同的子类别。我预计还有很多其他的好处,还没有被发现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12046260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档