2016-04-04 69 views
0

有了這樣的表結構&數據:層次查詢在MySQL

| ID | PARENT | FIELD_1 | FIELD_2 | RATING | 
+------------------------------------------+ 
| 1 | NULL | F1V1 | F2V1 | 10  | 
| 2 | 1  | F1V2 | F2V2 | 20  | 
| 3 | 2  | F1V3 | F2V3 | 30  | 
| 4 | 3  | F1V4 | F2V4 | 40  | 

是否有得到一個結果,像這樣的一種方式:

| ID | F_1 | F_2 | P_F_1 | P_F_2 | G_F_1 | G_F_2 | S_R | 
+-------------------------------------------------------------+ 
| 1 | F1V1 | F2V1 | NULL | NULL | NULL | NULL | 10 | 
| 2 | F1V2 | F2V2 | F1V1 | F2V1 | NULL | NULL | 30 | 
| 3 | F1V3 | F2V3 | F1V2 | F2V2 | F1V1 | F2V1 | 60 | 
| 4 | F1V4 | F2V4 | F1V3 | F2V3 | F1V2 | F2V2 | 90 | 

我真正想要的,你可以看到,是對於每一個記錄,如果有父母(P),祖父母(G)等記錄(遞歸可能達到4級或任何其他已知的有限數字),其祖先的字段前綴(可以編程地發生)和SUM(或任何其他GROUP函數)cal也遞歸地計算值。

前記錄#4:

ID = 4 
FIELD_1 AS F_1 = F1V4 
FIELD_2 AS F_2 = F2V4 
PARENT_FIELD_1 AS P_F_1 = F1V3 
... 
GRANDPARENT_FIELD_2 AS G_F_2 = F2V2 
SUM_RATING AS S_M = (40 + 30 + 20) = 90** 

注: 即使記錄#1的記錄#4(盛大祖父母)將其評級沒有在總和計算的祖先,因爲它不是包含在查詢中。

+0

'FIELD_1'和'FIELD_2'是否共享相同的父項?這點我不清楚。 –

+0

@TimBiegeleisen FIELD_1和FIELD_2是任何記錄的兩個字段。我想要的是在當前記錄字段旁邊將這些字段作爲別名從他們的祖先中去除。 –

回答

1

這種簡單的方法:

SELECT t.id, 
      t.field_1 f_1, 
      t.field_2 f_2, 
      p.field_1 p_f_1, 
      p.field_2 p_f_2, 
      g.field_1 g_f_1, 
      g.field_2 g_f_2, 
      t.rating + COALESCE(p.rating,0) + COALESCE(g.rating,0) s_r 
    FROM table_name t 
LEFT JOIN table_name p 
     ON p.id = t.parent 
LEFT JOIN table_name g 
     ON g.id = p.parent 

並添加左連接,添加和字段選擇以遞歸的已知水平。

+0

是的,這是解決方案。 我寫了一個解決方案基於這樣的回答: http://stackoverflow.com/questions/20215744/how-to-create-a-mysql-hierarchical-recursive-query 而是因爲我用了相反的加入方向(ancestor.parent = descendant.id)我沒有得到預期的結果。 –