4

我需要存储一个家庭(即父母的一些孩子。那些孩子有自己的孩子等等..)

所以,我创建了一个具有以下结构的表族

id child child_id parent_id

当我保存一个孩子时,我会存储一个 parent_id。

现在,

当我想获取给定父母的所有孩子时,我可以轻松做到。

select child_id from family where parent_id = <given parent id>

但,

现在我想获取完整的家庭(给定父母的所有后代)

IE

我想获取所有具有给定 parent_id 的孩子 + 所有在第一个查询中是获取的孩子的孩子的孩子,依此类推。

有人可以帮助我吗?

我也是,可能有更好的方法来最初存储数据,所以我可以稍后获取它。有人可以指出更好的方法吗?

4

3 回答 3

1

您可以编写一个查询来获取子项及其所有依赖项,但首先您需要重新设计表结构并在添加新子项时强制执行协议以使查询始终有效。

看看这篇描述和解释这种方法的非常有用的文章

于 2012-11-08T12:41:23.807 回答
0

使用子查询

select GC.grandchildren,children from children C inner join grandchildren GC
  on C.childid=GC.id and
  C.childid in 
 (select child_id from family
  where parent_id = <given parent id>)
于 2012-11-08T12:11:11.697 回答
0

关于您的表设计,我认为您的child_id列是多余的,您可以通过设置哪个是某个节点的 parent_id 来构建层次结构,并将根节点的 parent_id 留空。

关于遍历所有孩子的查询,您可以使用此处提出的方法(http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/),但这意味着您需要遵循您的 id 中的一些约定并为每个节点存储一个“路径”。(如果您需要在树的中间插入一些东西,这会使事情复杂化)

其他数据库品牌有针对此问题的子句(对于 Oracle,您有 STARTS WITH ... CONNECT BY 子句),但它们都不是 ANSI。

希望能帮助到你

于 2012-11-08T13:02:04.193 回答