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
WHEN 1 THEN CONCAT( '<' , t.tag, '>', t.`desc` )
WHEN 2 THEN CONCAT( '</' , t.tag, '>')
END AS xml_teil
FROM (SELECT tag, 1 AS flag, lft AS pt, id
FROM tree
UNION ALL
SELECT tag, 2 AS flag, rgt AS pt, id
FROM tree
ORDER BY pt, tag ) r
JOIN tree t
ON t.id = r.id
ORDER BY r.pt, r.tag;
+--------------+
| xml_teil |
+--------------+
| <A>content A |
| <B>content B |
| </B> |
| <C>content C |
| <D>content D |
| <E>content E |
| </E> |
| <F>content F |
| <G>content G |
| </G> |
| </F> |
| </D> |
| </C> |
| <H>content H |
| </H> |
| </A> |
+--------------+
16 rows in set (0.00 sec)
mysql>
Die einzelnen Ergebnis-Zeilen müssen dann noch in einen XML-String aneiander gehängt werden.
Mit XML kenne ich mich nicht besonders aus. Stimmt die "Richtung"?
Grüße
Thomas