Einzelnen Beitrag anzeigen
  #3  
Alt 19.10.2010, 14:22:12
mr_sol mr_sol ist offline
Anfänger
 
Registriert seit: Oct 2010
Alter: 58
Beiträge: 19
AW: NESTED SETS in XML - Lösung 1a

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:
Mit Zitat antworten