2016-04-04 17 views
0

diese Tabellenstruktur & Daten:hierarchische Abfrage in 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  | 

Gibt es eine Möglichkeit, ein Ergebnis wie dieses zu bekommen:

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

Was ich wirklich will, wie Sie sehen können, ist für jeden Datensatz, wenn es Eltern (P), Großeltern (G), usw. Datensätze (die Rekursion kann für 4 Ebenen oder jede andere endliche Zahl, die bereits bekannt ist), die Felder ihrer Vorfahren vorangestellt (das kann programmatisch außerhalb passieren der Abfrage) und ein SUM (oder eine andere GROUP-Funktion), die cal cules die Werte auch rekursiv.

ex Datensatz # 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** 

HINWEIS: Obwohl Datensatz # 1 ist ein Vorfahre von Datensatz # 4 (grand-Großeltern) das Rating ist nicht in der Summe berechnet, weil es nicht in der Abfrage enthalten.

+0

Haben 'FIELD_1' und' FIELD_2' das gleiche Elternteil? Das ist mir nicht klar. –

+0

@TimBiegeleisen FIELD_1 und FIELD_2 sind zwei Felder eines beliebigen Datensatzes. Was ich will ist neben den aktuellen Datensatzfeldern zu bekommen, da diese Felder Aliase von ihren Vorfahren aliasiert. –

Antwort

1

Diese einfachste Art und Weise:

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 

Und fügen links verbindet, Ergänzungen und Feldauswahl auf dem bekannten Niveau der Rekursion.

+0

Ja, das ist die Lösung. Ich schrieb eine Lösung auf der Grundlage dieser Antwort: http://stackoverflow.com/questions/20215744/how-to-create-a-mysql-hierarchical-recursive-query sondern weil ich die Verbindungen in entgegengesetzten verwendet direction (ancestor.parent = descendant.id) Ich habe das erwartete Ergebnis nicht erhalten. –