AW: NESTED SETS in XML - Gruppierung von Elementen
Tabelle für Lösung 2
Deinen Ansatz finde ich gut, hätte ich mir aber eine einfache Tabellestruktur gedacht
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');
-- Sub Elemente - Sub-Elemente für G
CREATE TABLE IF NOT EXISTS `tree_sub` (
id INT NOT NULL,
tag varchar(100) NOT NULL,
description text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO tree_sub (id, tag, description) VALUES
(7,'G2','content G1'),
(7,'G3','content G2'),
(3,'G2','content C1');
id_sub mit id verknüpfen
Funkt nicht aber aber meine Überlegung ging etwa in diese Richtung
Code:
SELECT CASE r.flag
WHEN 1 THEN CONCAT( '<' , t.tag, '>', t.`desc`,GROUP_CONCAT('<',ts.tag,'>',ts.description,'<',ts.tag,'/>') )
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) r
LEFT JOIN tree t
ON t.id = r.id
LEFT JOIN tree_sub ts
ON t.id = ts.id
ORDER BY r.pt;
Vielleicht noch zu Lösung 1 (ohne Zusatztabelle)
Gibts bei UNION auch die Möglichkeit einen Teil von zB Menge A in C auszuschliessen. C währe die Menge aller Unterelemente
zB:
Code:
SELECT A.tag, 1 AS flag, A.lft AS pt, A.id
FROM tree AS A
GROUP BY pt
UNION ALL
SELECT B.tag, 2 AS flag, B.rgt AS pt, B.id
FROM tree AS B
GROUP BY pt
UNION ALL
SELECT C.tag, 3 AS flag, C.rgt AS pt, C.id
FROM tree AS C
WHERE A.id!=C.id
Geändert von mr_sol (19.10.2010 um 20:15:11 Uhr)
|