【问题标题】:Nested queries (dependent queries)嵌套查询(依赖查询)
【发布时间】:2012-11-08 21:02:04
【问题描述】:

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

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

id    孩子    child_id    parent_id

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

现在,

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

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

但是,

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

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

有人可以帮帮我吗?

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

【问题讨论】:

标签: mysql sql database sqlite


【解决方案1】:

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

看看this very useful article describing and explaining this method

【讨论】:

  • 感谢这篇文章,它真的很棒。但它确实通过存储 id 使事情复杂化。如果其他人没有提出更好的解决方案,我将使用它。顺便说一句,可以更改数据库模式或切换到其他模式会有所帮助(例如,最初我将 json 存储到一个字段中以存储所有子项,但失败得很惨)。 MongoDB 在这里不是一个选项。
【解决方案2】:

使用子查询

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>)

【讨论】:

  • 您的查询将只检索给定父 ID 的子代,但是孙辈呢?
  • 不是和select child_id from family where parent_id = &lt;given parent id&gt;一样吗?
【解决方案3】:

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

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

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

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 2021-01-29
    • 2020-08-01
    相关资源
    最近更新 更多