Lösung für Ansatz 1
Code:
SET @a=0;
SELECT CASE flag
WHEN 1 THEN
IF(@a=t.lft,
CONCAT( '<' , t.tag, '>', t.`desc`,'<' , t.tag, '>'),
CONCAT( '<' , t.tag, '>', t.`desc`))
WHEN 2 THEN
CONCAT( '</' , t.tag, '>')
END AS xml_teil,
@a:=t.lft
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
GROUP BY pt
ORDER BY pt,id) r
JOIN tree t
ON t.id = r.id
ORDER BY r.pt;
Erklärung:
Erste Unionmenge bleiben alle Elemente nach lft - Zweite Menge werden alle mit gleichen rgt "groupiert" und nach id sortiert.
Da die Unterelemente alle recht von <> stehen sollten. Mit @a stellt man fest ob es ein <> sonst kommt <>xx</>
Frage: wie würdest du die Tabelle den Indizieren?
Eine andere Möglichkeit währe noch eine weitere UNION Menge (Menge aller Unterelemente) hinzuzufügen und WENN zu erweitern.
Leider bin ich nicht dahinter gekommen wie ich diese Menge erzeugen soll -
-Eine Idee?
An Lösungsansatz 2 (2 tabellen) arbeite ich gerade. Ich würde gerne beide Auflösen um die Geschwindigkeit zu Testen.
Hier zu Testzwecken für Lösung 1
Code:
CREATE TABLE IF NOT EXISTS `tree` (
`id` int(11) NOT NULL,
`tag` varchar(100) NOT NULL,
`lft` int(11) NOT NULL,
`rgt` int(11) NOT NULL,
`desc` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Daten für Tabelle `tree`
--
INSERT INTO `tree` (`id`, `tag`, `lft`, `rgt`, `desc`) VALUES
(1, 'A', 1, 16, 'content A'),
(2, 'B', 2, 3, 'content B'),
(3, 'C', 4, 13, 'content C'),
(4, 'D', 5, 12, 'content D'),
(5, 'E', 6, 7, 'content E'),
(6, 'F', 8, 11, 'content F'),
(7, 'G', 9, 10, 'content G'),
(8, 'H', 14, 15, 'content H'),
(9, 'G2', 9, 10, 'content G1'),
(10, 'G3', 9, 10, 'content G2'),
(11, 'C1', 4, 13, 'content C1');
grüsse Helmut - Du hast mir wirklich geholfen, oft genügt ja schon ein Hinweis und es kommt ins Rollen: