Mysql 同一表中父/子关系的分层数据联接
我有下表:Mysql 同一表中父/子关系的分层数据联接,mysql,sql,Mysql,Sql,我有下表: Id ParentId Weight 1 1 0 2 1 10 3 2 5 ParentId引用了同一表格的Id。我如何查询这个表,以便自己连接它,将第三列的累积权重相加 例如,如果我想知道Id2的累计权重,结果将返回15(Id2+Id3=15),因为第3项的父项是2。如果我想知道项目3的累计重量,它将返回5,因为没有任何记录的父id为项目3 本质上,如果我查询的记录有一个子项,我想添加数据的子项序列并返回一个结果 这
Id ParentId Weight
1 1 0
2 1 10
3 2 5
ParentId
引用了同一表格的Id
。我如何查询这个表,以便自己连接它,将第三列的累积权重相加
例如,如果我想知道Id2的累计权重,结果将返回15(Id2+Id3=15),因为第3项的父项是2。如果我想知道项目3的累计重量,它将返回5,因为没有任何记录的父id为项目3
本质上,如果我查询的记录有一个子项,我想添加数据的子项序列并返回一个结果
这是不是可以一次性访问数据库,还是我必须遍历整个记录集才能找到匹配项?最后我查看了一下,mysql没有内置的分层查询方法,但您始终可以使用邻接列表等技术,在,它将层次结构编码到另一个表中,并允许您根据该表进行连接以检索层次结构中的子树。您需要为树编制索引。请参阅以了解一些方法。查看。如果您的表不经常更新,您可以稍微修改一下它们的
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_表
,填充该表的数据也不会花费太长时间