2016-04-04 33 views
0

bu tablo yapısı & veri olması gördüğünüz gibi,Hiyerarşik sorgu MySQL

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

Aslında istediğim, eğer ebeveyn (P), büyükbaba (G), vb. kayıtlar varsa (kayıtlar 4 seviyeye veya zaten bilinen herhangi bir sonlu sayıya gidebilir), atalarının alanları önceden (programlı olarak dışarıda gerçekleşebilir) sorgulama) ve bir SUM (veya başka bir GROUP işlevi) değerleri yinelemeli olarak da gösterir.

eski rekor # 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** 

NOT: onun değerlendirmesi toplamında hesaplanmaz rekor 4. (grand-büyükbaba) atalarından değildir rekor 1. olsa çünkü sorguda bulunan

+0

"FIELD_1" ve "FIELD_2" aynı üst öğeyi paylaşıyor mu? Bu bana açık değil. –

+0

@TimBiegeleisen FIELD_1 ve FIELD_2 herhangi bir kaydın iki alanıdır. İstediğim şey, bu alanların yanında, atalarından gelen takma adlar gibi takma adlar elde etmek. –

cevap

1

Bu en basit yolu:

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 

Ve eklemek sol, ya yinelenen bilinen seviyeye eklemeler ve alan tercihi katılır.

+0

Evet, çözüm budur. Bu Yanıta göre bir çözüm yazdı: http://stackoverflow.com/questions/20215744/how-to-create-a-mysql-hierarchical-recursive-query ama kullanıldığından zıt katılır yön (ancestor.parent = descendant.id) Beklenen sonucu almadım. –