Einzelnen Beitrag anzeigen
  #8  
Alt 20.10.2010, 06:43:42
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

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