2011-05-16 44 views
0

我有如下表:分层数据加入父/子关系的同桌

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。

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

这是可能的一举做到数据库,或者我将不得不遍历整个记录集来查找匹配?

回答

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

0

最后我看了一下,mysql没有内置的分层查询方式,但是你总是可以使用诸如邻接列表之类的技术,在Managing Hierarchical Data in MySQL中讨论过(在其他技术中),它编码层次结构另一个表,并让你加入这个表来检索层次结构中的子树。