MySQL中的分层结果

时间:2016-01-23 22:22:49

标签: mysql

我有两张桌子:

+---------------------------------+
|           ORGANIZATION          |
+----------------+----------------+
|     ORG_ID     |   PARENT_ID    |
+----------------+----------------+
|         1      |      null      |
|        22      |       1        |
|       333      |       22       |
+---------------------------------+

和第二个ORGs层次结构:

Org ID# 1
    |
    |----- Org ID# 22
             [MT -> value]
             [TMP -> value]
                |
                |----- Org ID# 333
                        [CC -> value]
                        [MT -> shows value defined in parent #22]
                        [TMP -> redefined value]

表示参数的层次结构' UI上的值:

+----------------+--------------------+----------------+
|     ORG_ID     |        NAME        |      VALUE     |
+----------------+--------------------+----------------+
|       333      |         CC         |       ...      |
|        22      |         MT         |       ...      |
|       333      |         TMP        |       ...      |
+------------------------------------------------------+

这就是事情:如果父母和孩子都定义了一些属性值(例如示例中的TMP),我们总是应该向孩子返回由孩子重新定义的值。

所以,我想查询一个给定的子ID(或者从子到root的所有ID的集合)将返回我在最后一级定义的记录。

,例如,对于上面的例子,如果我通过333(或1,2,233的集合),我希望得到一个结果:

add_ordered()

来自子ORG#333的TMP值将从父ORG#22隐藏一个。

所以,我需要以某种方式过滤父ORG的记录,只留下实际的子ORG记录。同时,如果某个值未在子级别重新定义,我们将从其父级获取值(与在ORG#22中定义但未在ORG#333中重新定义的MT)。

我该怎么做?

非常感谢!

1 个答案:

答案 0 :(得分:0)

这应该是一个评论,但它有点长。由于mysql没有“connect by”运算符,因此你很难在mysql中执行此操作。唯一可行的解​​决方案是编写一个递归过程来填充临时表。但它效率不高。实际上,一种解决方案取决于数据更改的频率,将映射应用于数据库中的所有节点。其他解决方案(图形引擎,地理空间索引或替代模式)是否更合适将取决于更改的频率,记录数量,数据的分布和基数(您未提及)。