NESTED SETS in XML ausgeben
Hallo
Vielleich hat jemand von euch eine Idee oder Hinweis. Meine Datenstruktur (mysql) ist als Nested Sets abgebildet. Ich möchte diese als XML Baum ausgeben (kein PHP). Meine bisherigen Versuche scheitern am schliessen der Tags. BEISPIEL-BAUM soll folgendes Ergebnis liefern: Code:
A[01,16] Hier ein Test-CONTENT: Code:
CREATE TABLE IF NOT EXISTS `tree` ( Vielen Dank im voraus |
AW: NESTED SETS in XML ausgeben
Leider kenne ich mich mit XML zuwenig aus, als dass ich spontan dafür eine Lösung finde. Ich denke MySQL ist aber dafür noch nicht richtig ausgestattet:
Die MySQL-XML findet Du hier (ab MySQL 5.1.5 ): http://dev.mysql.com/doc/refman/5.1/...functions.html Andere Datenbank wie IBM DB2 oder ORACLE (die es beide auch als kostenlose Versionen gibt) können inzwischen besser mit XML umgehen. Hier was ausführliches für ORACLE: http://download-uk.oracle.com/docs/c...9/xdb13gen.htm EDIT ... noch was für MySQL http://dev.mysql.com/tech-resources/...ql5.1-6.0.html http://www.mysqludf.org/lib_mysqludf_xql/index.php Grüße Thomas |
AW: NESTED SETS in XML ausgeben
Vielen Dank für dein Bemühen. Leider ist nicht der Lösungsweg dabei. Der Nested Set ist super schnell um Bäume aufzubauen, leider klappt das schliessen der XML Tags nicht.
|
AW: NESTED SETS in XML ausgeben
Schade, aber zeig doch mal wie Dein bisheriger SQL aussieht, dann fällt vielleicht noch jemand etwas ein und ich lerne was neues...
Grüße Thomas |
AW: NESTED SETS in XML ausgeben
Ich habe 2 Lösungsansätze
Lösungsansatz 1: Code:
SELECT n.*, p...parent Elemente mit einen lft,rgt Wert n...node oder das aktuelle Elemente welches auch einen lft,rgt Wert besitzt, welche sich zwischen p.lft und p.rgt befindet zB: Element G[9,10] befindet sich innerhalb von A[1,16],C[4,13],D[5,12],F[8,11],G[9,10] - aus dieser Anzahl der Elemente kannst du die Tiefe des Baumes auf G bezogen erfahren. Um zB Element G zu schliessen benötige ich </G></F></D></C> das Element </A> sollte sich nicht in der Menge gefinden. mit p.rgt<n.rgt+4 habe ich die Menge beschränkt - nicht sehr sinnvoll. http://www.klempert.de/nested_sets/ Gute Seite Lösungsansatz 2: Die Menge mit einen JOIN einschränken. Ich gehe von 2 Mengen aus: Menge der Elemente ober aktuellen Element (siehe oben) zB:G - G,F,D,C,A Menge aller Elemente bei welcher der lft Wert grösser als der aktuelle lft und rgt Wert ist. zB:G - H schränke diese auf das erste Element ein (falls mehrere vorhanden sind) Schränke erste Menge auf alle Elemente ein die kleiner als der lft Wert des Elemente H sind - G,F,D,C http://www.developersdex.com/gurus/a...112.asp?Page=3 Die Seite des Nested Sets Meisters Nur wie mache ich das am besten? |
AW: NESTED SETS in XML ausgeben
Zitat:
a) Ich denke, Du benötigt einen rekursiven SQL und der ist mit MySQL derzeit nicht möglich, soweit ich weiß. Eventuell läßt sich sowas mit einem Stored Procedure nachbauen. b) Muss es unbedingt XML sein? Mit JSON gibt es ähnliche Möglichkeiten, allerdings bist Du dann bei PHP oder JavaScript Rekursives SQL mit IBM DB2: Code:
WITH common_table ( spaltenliste ) AS http://www.mayeruli.de/db2/nested-table.html Nächste Woche habe ich wieder mehr Zeit dafür..bis dahin. Grüße Thomas |
AW: NESTED SETS in XML ausgeben
Hallo Thomas!
Danke für deine Rückmeldung. Erstaunlicherweise gibt für Nested Set viele Lösungen (Blattsuch, Kindersuche, Levelhöhe, Nachfolger, Vorfahren,ect) nur dieses Thema findet man nicht. Es gibt zwar ein Buch: Book 8.3.2 [Page 195] - XML data management: native XML and XML-enabled database systems http://books.google.com/books?id=7LN...page&q&f=false wo das Nested Sets für XML verwendet wird. Auch hier Lösungsansätze: http://www.artfulsoftware.com/mysqlb...qled1ch20.html 1) Die Idee mit UNION finde ich gut, sollte mit mySQL 5.0 klappen stehe aber mit der Query an 2) Habe noch etwas probiert, auf Basis Menge beschneiden (Lösungsansatz 2). Code:
SELECT node.tag,follower.tag,node.lft,follower.lft,node.rgt,follower.rgt Schneide Menge der Nachfolger an der Stelle wo erstesmal ein höhere lft Wert steht als der aktuelle Knoten (node). Alles was sich zwischen den aktuellen node und kleiner als s.lft befindet bleibt erhalten. zB: G[9,10] -> Nachfolger F,D,C,H,A Erster Wert wo lft grösser als G rgt -> H[14,15] Restmenge ist daher -> F,D,C Problem: es sollte eine Ausnahmeregel für A gebe...H wird nicht ausgegeben. Leider kann ich nicht mit JSON arbeiten, da die Verarbeiten in XSLT erfolgt. MySQL ist für mein Projekt aus anderen Gründen sehr gut geeignet.... vielleicht klappts ja doch:) grüsse helmut |
AW: NESTED SETS in XML ausgeben
So, mal eine erster Versuch zum Thema. Die Spalte "desc" würde ich umbenennen. Reservierte SQL-Worter als Spaltename zu verwenden, schafft nur unnötig Probleme.
Code:
SELECT CASE flag Mit XML kenne ich mich nicht besonders aus. Stimmt die "Richtung"? Grüße Thomas |
AW: NESTED SETS in XML ausgeben
Danke, genial einfach gelöst....ich denke zu kompliziert.
Die baust zwei Menge zusammen und weist lft bzw rgt pt zu. Die gesamte Menge wird nach pt sortiert. Aus der flag erkennst du ob <> oder </>. Der t dient zum Durchlaufen des Baumes. Stimmt's? Dürfte ich noch eine zusätzliche Frage stellen? |
AW: NESTED SETS in XML ausgeben
Danke für das Lob!
Genau, der SQL arbeitet so, wie Du es verstanden hast. Es war kein rekursives SQL nötig. Da hab ich zuerst zu kompliziert gedacht. Natürlich kannst Du hier weitere Fragen stellen. Am Besten in einem neuen Thread, wenn es nicht direkt etwas mit dieser Frage zu tun hat. Grüße Thomas |
Alle Zeitangaben in WEZ +2. Es ist jetzt 14:25:28 Uhr. |
Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.