嵌套查询(依赖查询)

时间:2012-11-08 12:04:54

标签: mysql sql database sqlite

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

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

  

ID子child_id PARENT_ID

当我保存孩子时,我会将parent_id与它一起存储。

现在,

当我想要获取给定父母的所有孩子时,我可以很容易地做到。

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

但是,

现在我想要获取完整的系列(给定父级的所有后代)

我想在第一个查询中获取所有具有给定parent_id +所有子节点的子节点,这些子节点是第一个查询中的获取子节点等等。

有人能帮助我吗?

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

3 个答案:

答案 0 :(得分:1)

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

查看this very useful article describing and explaining this method

答案 1 :(得分: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>)

答案 2 :(得分:0)

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

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

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

希望有所帮助