分层数据在同一个表中连接父/子关系

时间:2011-05-16 13:24:28

标签: mysql sql

我有下表:

Id  ParentId  Weight
1   1         0
2   1         10
3   2         5

ParentId引用同一个表的Id。如何查询此表以便我自己加入它,累加第三列的累积权重?

例如,如果我想知道Id 2的累积权重,结果将返回15(Id2 + Id3 = 15),因为项目3的父项是2.如果我想知道项目3的累积权重,它将返回5,因为没有记录具有项目3的父ID。

基本上,如果我查询的记录有一个孩子,我想添加数据的子序列并返回一个结果。

这是否可以一举到达数据库,还是我必须遍历整个记录集才能找到匹配项?

3 个答案:

答案 0 :(得分:1)

看看this article。如果您的表没有经常更新,您可以稍微修改它为GenericTree生成所有行的所有路径的ParentId过程(并在每次将记录插入表或更新CREATE TABLE `tree_for_my_table` ( `rootID` INT(11) NOT NULL, // root node id `parentID` INT(11) NOT NULL, // current parent id `childID` INT(11) NOT NULL, // child id (direct child of the parent) `level` INT(11) NOT NULL, // how far child is from root PRIMARY KEY (`rootID`, `parentID`, `childID`), UNIQUE INDEX `childID` (`childID`, `level`) ) 列时调用它),将此数据存储到新表中,然后您可以使用简单查询执行所需的所有任务。就个人而言,我最终得到以下表格结构:

my_table

即使对于非常大的{{1}},为该表填充数据也不会花费太长时间。

答案 1 :(得分:0)

最后我看,mysql没有内置的分层查询方式,但是你总是可以使用Managing Hierarchical Data in MySQL中讨论的(在其他技术中)邻接列表等技术进行编码另一个表中的层次结构,允许您联接以检索层次结构中的子树。

答案 2 :(得分:0)

您需要索引树。有关实现此目的的一些方法,请参阅Managing Hierarchical Data in MySQL