Einzelnen Beitrag anzeigen
  #6  
Alt 19.10.2010, 20:01:52
mr_sol mr_sol ist offline
Anfänger
 
Registriert seit: Oct 2010
Alter: 58
Beiträge: 19
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)
Mit Zitat antworten