【问题标题】:How to query graph/hierarchical data in mysql如何在 mysql 中查询图形/分层数据
【发布时间】:2012-09-05 11:11:06
【问题描述】:

假设我有一个层次结构的对象表:

A
|--B
|--C
|  +--D
+--E

它们存储在“父子”表中:

parent  child
A       B
A       C
C       D
A       E

如何查询这个以获得上面定义的结构?我想我需要一些能产生这样信息的东西:

object  full_path
A       NULL
B       A
C       A
D       A.C
E       A

我不知道如何处理嵌套超过一层的对象。感觉我可能需要遍历表(不知道这在 SQL 中是否可行),或者使用我以前从未遇到过的某种查询。

附加信息:

  1. A 不必是唯一的孤立对象。
  2. 孩子可能有多个父母,但现在我很高兴能找到更容易解决的方案。我可以通过简单的GROUP BYMIN 语句将多父结构转换为单父结构。

【问题讨论】:

  • 所有项目是否只有一个父项,数据是否只有一个头(即只有 A 没有父项,所有项目都是 A 的后代),并且在中间表中,A 是否有记录说它没有父母?
  • 查看编辑。 A 没有记录表明它没有父级,但这可以通过简单的left join 查询来确定。

标签: mysql database graph relational-database hierarchy


【解决方案1】:

其他答案都是正确的,mysql中没有递归功能。此链接描述了如何在 mysql 中处理层次结构:http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/

我找到了另外两个 SO 问题的链接:How to do MySQL Looped Join which tests if results are complete?Hierarchical Data in MySql

【讨论】:

    【解决方案2】:

    MySQL 不支持递归查询。但是如果你可以使用Nested Set 来简化获取子树。

    【讨论】:

      【解决方案3】:

      你不能用 mysql 来做,因为 mysql 不支持递归函数,但如果你不需要无限深度,你可以使用自连接来获取树。否则,您需要编程语言中的递归函数,或者您可以使用嵌套集,这样可以更轻松地选择子树。

      【讨论】:

        【解决方案4】:

        基本上这行不通!

        您需要定义根节点。顺便说一句,您的“树”与您的层次定义不匹配。

        这将是一个更好的方法:

        parent  child
        -       A
        A       B
        A       C
        C       D
        -       E
        

        减去的父条目是根节点。这反映了你的树。

        Sql 不提供层次结构查询。但是你可以用一个技巧来迭代:

        可以在这里找到一个很好的解释:

        我会尝试找到根节点并使用递归来连接文本。

        根节点将是:

        SELECT * FRON objects WHERE parent = '-'
        

        【讨论】:

        • 我认为我的树形图匹配! (也许我的图表是非标准的)
        【解决方案5】:

        如果你有一个键 (varchar)m 你可以按它排序。键值如下所示:

        001
        001.001
        001.001.001
        001.001.002
        001.001.003
        002
        002.001
        002.001
        003
        003.001
        ...
        ...
        

        【讨论】:

        • 这就是我需要钥匙的原因。我如何获得它?
        猜你喜欢
        • 2020-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 2023-03-15
        • 1970-01-01
        • 2018-07-09
        相关资源
        最近更新 更多