2016-01-23 91 views
0

我有兩個表:分層結果在MySQL

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

,第二個與[機構層次結構:

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

其表示關於UI參數值的層次結構:

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] 

這是事情:如果父母和孩子都定義了一些屬性值(例如TMP),我們總是應該返回到c重新定義一個孩子的價值。

所以,我想有一個查詢,通過給定的子ID(或可能設置所有的ID從子到根)將返回最後一級定義的記錄。

例如,對於上面的例子,如果我通過333(或一組1,22,333),我想有的結果:

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

,其中來自子ORG#333 TMP的值會隱藏父ORG#22的一個。

所以,我需要以某種方式篩選父ORG的記錄,並只保留子ORG的實際記錄。同時,如果一個值不是在子級重新定義的,我們從它的父級取值(與在ORG#22定義的MT一樣,但不在ORG#333重新定義)。

我該怎麼做?

非常感謝!

回答

0

這應該是一個評論,但它有點長。由於mysql沒有「connect by」操作符,所以你很難在mysql中這樣做。唯一可行的解​​決方案是編寫一個可以填充臨時表的遞歸過程。但它不會很有效率。事實上,一種解決方案取決於數據更改的頻率是將映射應用於數據庫中的所有節點。其他解決方案(圖形引擎,地理空間索引或替代模式)可能更合適取決於更改記錄數,分佈和數據基數(您未提及)的頻率。