Du hast natürlich Recht die zweite Tabelle mit einer id_tree auszustatten und GROUP_CONCAT mit group by.
Habe die Lösungen überarbeitet:
Ansatz zu Lösung 1b (eine Tabellen)
Meine Überlegung für Menge aller Unterelemente - bei UNION zu ergänzen
a Oberelemente, b Alle Elemente durch Ausschliessen der Schnittmenge bleiben Unterelemente
klappt aber nicht
Code:
SELECT tag, 3 AS flag, lft AS pt, id
FROM tree a
RIGHT JOIN tree b ON a.id=b.id
WHERE b.id IS NULL
GROUP BY a.lft
Guter Link für JOIN:
http://www.codeproject.com/KB/databa...JOINS_orig.jpg
Lösungansatz 2 (zwei Tabellen)
Habe nochmals die Tabellen überarbeitet - Reiner Purismus, dieser Lösungsansatz - Tabellen:
tree...nur noch die Baumstruktur ohne Inhalt
element...alle Elemente und Content wobei der erste in der Reihenfolge immer das Oberelement ist
Test-Content
Code:
CREATE TABLE IF NOT EXISTS `tree` (
`id` int(11) NOT NULL,
`lft` int(11) NOT NULL,
`rgt` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Daten für Tabelle `tree`
--
INSERT INTO `tree` (`id`, `lft`, `rgt`) VALUES
(1, 1, 16),
(2, 2, 3),
(3, 4, 13),
(4, 5, 12),
(5, 6, 7),
(6, 8, 11),
(7, 9, 10),
(8, 14, 15);
CREATE TABLE IF NOT EXISTS `element` (
`id` int(11) NOT NULL,
`tag` varchar(100) NOT NULL,
`desc` text NOT NULL,
`id_tree` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Daten für Tabelle `element`
--
INSERT INTO `element` (`id`, `tag`, `desc`, `id_tree`) VALUES
(1, 'A', 'content A', 1),
(2, 'B', 'content B', 2),
(3, 'C', 'content C', 3),
(4, 'D', 'content D', 4),
(5, 'E', 'content E', 5),
(6, 'F', 'content F', 6),
(7, 'G', 'content G', 7),
(8, 'H', 'content H', 8),
(9, 'G2', 'content G1', 7),
(10, 'G3', 'content G2', 7),
(11, 'C1', 'content C1', 3);
Fast die Lösung - Fehler liegt bei group_concat, liefert das Oberelement nochmals - EINE IDEE?
Code:
SELECT CASE flag
WHEN 1 THEN
CONCAT( '<' , e.tag, '>',e.desc,GROUP_CONCAT('<' , e.tag, '>',e.desc, '</' , e.tag, '>'))
WHEN 2 THEN
CONCAT( '<' , e.tag, '>',e.desc, '</' , e.tag, '>')
END AS xml_teil
FROM (
SELECT 1 AS flag, lft AS pt, id
FROM tree
UNION ALL
SELECT 2 AS flag, rgt AS pt, id
FROM tree
ORDER BY pt,id) r
LEFT JOIN tree t
ON t.id = r.id
LEFT JOIN element e
ON e.id_tree = t.id
GROUP BY r.pt
ORDER BY r.pt;
grüsse helmut