Autor | Zpráva | ||
---|---|---|---|
vladap Profil |
#1 · Zasláno: 16. 5. 2010, 01:19:33
Přeji hezký den,
Mám data v tabulce. Data mají mezi sebou vazbu. Podle typu záznamů to může vypadat takto: 1:0, 1:N nebo 1:1. Příklad uživ. zobrazení dat: ->Zaznam 1 -->Zaznam 2 --->Zaznam 3 --->Zaznam 6 -->Zaznam 4 --->Zaznam 7 ->Zaznam 5 Jinak řečeno, příklad: Zaznam 3 a 6 mají vazbu na Zaznam 2, Zaznam 2 má vazbu 1 atd... Přičemž záznamy nejsou lineárně inkrementalni, ale mohou být mezi sebou zproházené (položka vznikla později než ta co je vázána na další větev - TTree). V tabulce to mám vyřešené tak, že každý záznam má své vlastní ID, třeba Column_ID a každý záznam má atribut nazvaný např. column_att (což je vlastně ID položky, na kterou je vazba). Záznamy v tabulce vypadají nasledovně: - Nazev - Column_ID - Column_Att (def. vazba) - Zaznam 1 - 1 - NULL - Zaznam 2 - 2 - 1 - Zaznam 3 - 3 - 2 - Zaznam 4 - 4 - 1 - Zaznam 5 - 5 - NULL - Zaznam 6 - 6 - 2 - Zaznam 7 - 7 - 4 No a toto je výsledek, který potřebuji dostat jako výstup ze selectu (viz příklad na začátku): - Nazev - Column_ID - Column_Att - Zaznam 1 - 1 - NULL - Zaznam 2 - 2 - 1 - Zaznam 3 - 3 - 2 - Zaznam 6 - 6 - 2 - Zaznam 4 - 4 - 1 - Zaznam 7 - 7 - 4 - Zaznam 5 - 5 - NULL Dokážu záznamy seřadit podle této vazby nicméně to mám udělané dost složitě přes cursors (storage procedure). A je to bolestivě pomalé. Potřebuji vymyslet select, který mi seřadí záznamy podle vazeb (sestupně/vzestupně). Díky moc za nakopnuti. vlada |
||
Alphard Profil |
#2 · Zasláno: 16. 5. 2010, 09:09:36
Použil jste klasickou metodu (vašemu Column_Att se obvykle říká Parent_ID), data se z ní tahají rekurzí, ať již na úrovni databáze, nebo v aplikaci po načtení všech dat (pro menší množinu dat). Jednoduchý a efektivní select s největší pravděpodobností nesestrojíte :-)
Jednoduchý výpis poskytne metoda traverzování kolem stromu, ale zase za cenu obtížné editace. Metody ukládání stromových dat v relačních databázích | Interval.cz PHP triky - Traverzování kolem stromu prakticky |
||
Časová prodleva: 14 let
|
0