SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

PHP 5.3 & MySQL 5.1

PHP 5.3 & MySQL 5.1 zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Deine Leidenschaft ist die Unterwasserfoto-grafie?


Dann ist Qozido genau das Richtige für Dich!

Die Bilderverwaltung mit Logbuch für Taucher und Schnorchler ist da!

www.qozido.de

 


Zurück   PHP Forum > SELFPHP > MySQL

MySQL Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQL diskutieren

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 18.10.2010, 08:20:36
mr_sol mr_sol ist offline
Anfänger
 
Registriert seit: Oct 2010
Beiträge: 19
mr_sol befindet sich auf einem aufstrebenden Ast
NESTED SETS in XML - Gruppierung von Elementen

Hallo Thomas!


Auf Basis unterer Baumstruktur und der Basisquery http://www.selfphp.de/forum/showthread.php?t=23668 suche ich eine Möglichkeit der XML Ausgabe bei gruppierten Elementen. Der Vorteil liegt im einfacheren Einfügen von Elementen bei grossen Bäumen.

Code:
vcard
            n
			           given
					   familie
					   additional
             geo
			          latitude
					  longitude
			 adr
			           street
					   city
					   country
					   zip

Code:
<vcard>
<n>
    <given>Max</given>
	<familie>Mustermann</familie>
	<additional>Dr</additional>
</n>
<geo>
     <latitude>48°12'N</latitude>
	 <longitude>16°22'E</longitude>
</geo>
<adr>
	<street>Mustergasse 13</street>
	<city>Vienna</city>
	<country>Austria</country>
	<zip>1010</zip>
</adr>
</vcard>

Meine Überlegung. Da das Einfügen in einen Nested Set Baum recht aufwendig ist. (Alle lft,rgt des gesamte Baum
hinter den neuen Element müssen neu beschrieben werden). Gibt es zwei Möglichkeiten.



Lösungsansatz 1) Zusammenfassen von Elemente zu Gruppen

zB: Element geo besteht aus Unterelemente latitude,longitude wobei die Reihenfolge der der Unterelemente egal ist

Am Beispiel vcard würde die Grundstruktur so ausschauen

vcard[1,8]
n[2,3]
geo[4,5]
adr[6,7]


für alle Unterelemente von geo[4,5] gilt (man kann den beliebig viele Unterelemente einfügen mit geringstem Aufwand)
latitude[4,5]
longitude[4,5]


Ergebnis:
vcard[1,8]
n[2,3]
geo[4,5],latitude[4,5],longitude[4,5]
adr[6,7]


geo hat die Eigenschaft die niedrigste id in der Gruppe zu besitzen

Ansatz: Baum mit Elemente zusammenbauen (wie bisher), Unterelemente per group_concat zusammenbauen und nach <> anhängen






Lösungsansatz 2) Zweite Tabelle anlegen

Eine Tabelle für Grobstruktur, eine für Unterelemente




Im Sinne des Nested Set "alles aus eine Struktur" finde ich die erste Lösung besser. Was sagt Du?


grüsse helmut

(Content liefere ich jeweils nach)

Geändert von mr_sol (18.10.2010 um 08:39:52 Uhr)
Mit Zitat antworten
  #2  
Alt 18.10.2010, 13:12:06
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 6
Beiträge: 395
thomas_w befindet sich auf einem aufstrebenden Ast
AW: NESTED SETS in XML - Gruppierung von Elementen

Zitat:
Zitat von mr_sol Beitrag anzeigen

Lösungsansatz 1) Zusammenfassen von Elemente zu Gruppen


Ergebnis:
vcard[1,8]
n[2,3]
geo[4,5],latitude[4,5],longitude[4,5]
adr[6,7]


geo hat die Eigenschaft die niedrigste id in der Gruppe zu besitzen
Die Lösung mit geo[4,5],latitude[4,5],longitude[4,5] mag zwar auf den ersten Blick einfacher sein, aber mit welcher Eigenschaft soll die Sortierung definiert werden. GROUP_CONCAT() oder so kann dann nur nach dem "tag" - Namen sortieren.

Zitat:
Zitat von mr_sol Beitrag anzeigen
Lösungsansatz 2) Zweite Tabelle anlegen

Eine Tabelle für Grobstruktur, eine für Unterelemente



Im Sinne des Nested Set "alles aus eine Struktur" finde ich die erste Lösung besser. Was sagt Du?
Durch Unterelemente ist das vielleicht nicht mehr eine Struktur, aber im Prinzip ist das Ganze mit den Koodinaten eigentlich kein "Nested Set", sondern eine "Zusammenbauanleitung". Bei Nested Set sind Abhängigkeiten (vater = 1, kind_von_vater = 1, etc.) über Spaltenwerte definiert. Das liegt hier so nicht vor. Deshalb wäre eine Untertabelle aus meiner Sicht auch okay und besser pflegbar.

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #3  
Alt 19.10.2010, 14:22:12
mr_sol mr_sol ist offline
Anfänger
 
Registriert seit: Oct 2010
Beiträge: 19
mr_sol befindet sich auf einem aufstrebenden Ast
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
  #4  
Alt 19.10.2010, 18:24:38
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 6
Beiträge: 395
thomas_w befindet sich auf einem aufstrebenden Ast
AW: NESTED SETS in XML - Gruppierung von Elementen

Also Deine Lösung #1 sieht ja eigentlich ganz aus.

Für die Lösung #2 habe ich an folgende Tabellen gedacht, aber so richtig einfach wird der SQL nicht. Auf die schnelle habe ich keine Lösung gefunden.

Also ..

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'),
(11, 'C1', 4, 13, 'content C1');


-- Sub Elemente - Sub-Elemente für G

CREATE TABLE IF NOT EXISTS `tree_sub` (
  id INT NOT NULL,
  id_tree INT NOT NULL, 
  tag varchar(100) NOT NULL,
  lft INT NOT NULL,
  rgt INT NOT NULL,
  description text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


INSERT INTO tree_sub (id, id_tree, tag, lft, rgt, description) VALUES
(1, 7, 'G2', 9, 10, 'content G1'),
(2, 7, 'G3', 9, 10, 'content G2');
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #5  
Alt 19.10.2010, 18:48:16
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 6
Beiträge: 395
thomas_w befindet sich auf einem aufstrebenden Ast
AW: NESTED SETS in XML - Gruppierung von Elementen

Na vielleicht hat ich doch eine Idee für die Lösung #2

Code:
SELECT CASE r.flag
         WHEN 1 THEN CONCAT( '<' , t.tag, '>', t.`desc` )
         WHEN 2 THEN CONCAT( '</' , t.tag, '>')
         WHEN 3 THEN CONCAT( '<' , ts.tag, '>', ts.description, '</' , ts.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
          
        UNION ALL
        
        SELECT ts.tag, 3 AS flag, ts.lft AS pt, ts.id
          FROM tree t
          JOIN tree_sub ts 
            ON ts.id_tree = t.id
     
        ORDER BY pt, tag ) r
   LEFT JOIN tree t
     ON t.id = r.id
   LEFT JOIN tree_sub ts
     ON ts.id = r.id     
ORDER BY r.pt, r.tag;

+---------------------+
| xml_teil            |
+---------------------+
| <A>content A        |
| <B>content B        |
| </B>                |
| <C>content C        |
| <C1>content C1      |
| <D>content D        |
| <E>content E        |
| </E>                |
| <F>content F        |
| <G>content G        |
| <G2>content G1</G2> |
| <G3>content G2</G3> |
| </G>                |
| </F>                |
| </D>                |
| </C>                |
| </C1>               |
| <H>content H        |
| </H>                |
| </A>                |
+---------------------+
20 rows in set (0.01 sec)

mysql>
Aber so richtig flexibel ist das Ganze immer noch nicht. Vermutlich kommt man bei genauerem Hinsehen (oder bei entsprechenden Anforderungen) nicht um eine echte "Vater/Kind" Lösung. Also um rekursives SQL drum herum.

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #6  
Alt 19.10.2010, 20:01:52
mr_sol mr_sol ist offline
Anfänger
 
Registriert seit: Oct 2010
Beiträge: 19
mr_sol befindet sich auf einem aufstrebenden Ast
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
  #7  
Alt 19.10.2010, 20:29:39
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 6
Beiträge: 395
thomas_w befindet sich auf einem aufstrebenden Ast
AW: NESTED SETS in XML - Gruppierung von Elementen

Zitat:
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');
Dieser Tabelle fehlt, dass eine einzelne Zeile nicht gezielt angesprochen werden kann. Das führt früher oder später zu echten Problemem. D.h. die
Spalte id_tree ist meiner Meinung nach notwendig.


Der GROUP_CONCAT() funktioniert nur, wenn ein GROUP BY entsprechend vorhanden ist.

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #8  
Alt 20.10.2010, 06:43:42
mr_sol mr_sol ist offline
Anfänger
 
Registriert seit: Oct 2010
Beiträge: 19
mr_sol befindet sich auf einem aufstrebenden Ast
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
  #9  
Alt 20.10.2010, 10:05:47
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 6
Beiträge: 395
thomas_w befindet sich auf einem aufstrebenden Ast
AW: NESTED SETS in XML - Gruppierung von Elementen

Hallo Helmut,

ich denke, die Lösung 1 ist eine Sackgasse.

Zur Lösung 2 folgendes:

Nachdem die Tabellenstruktur komplett umgestellt ist, muss natürlich auch der SQL neu überdacht werden.

Mein Vorschlag wäre somit:

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);


SELECT CASE r.flag
         WHEN 1 THEN CONCAT( '<' , r.tag, '>', r.`desc` )
         WHEN 2 THEN CONCAT( '</' , r.tag, '>')
         WHEN 3 THEN CONCAT( '<' , r.tag, '>', r.`desc`, '</' , r.tag, '>')
        END AS xml_teil
   FROM (SELECT e.tag, 1 AS flag, t.lft AS pt, e.`desc`
           FROM tree t
           JOIN element e 
             ON e.id_tree = t.id
          WHERE  1 = ( SELECT COUNT(*) 
                         FROM element e2 
                        WHERE e2.id_tree = e.id_tree
                     )             
             
         UNION ALL
         
         SELECT e.tag, 2 AS flag, t.rgt AS pt, e.`desc`
           FROM tree t
           JOIN element e 
             ON e.id_tree = t.id 
          WHERE  1 = ( SELECT COUNT(*) 
                         FROM element e2 
                        WHERE e2.id_tree = e.id_tree
                     )                          

         UNION ALL
        
         SELECT e.tag, 3 AS flag, t.rgt AS pt, e.`desc`
           FROM tree t
           JOIN element e 
             ON e.id_tree = t.id
          WHERE  1 < ( SELECT COUNT(*) 
                         FROM element e2 
                        WHERE e2.id_tree = e.id_tree
                     )
     
        ) r

ORDER BY r.pt, r.tag;

+---------------------+
| xml_teil            |
+---------------------+
| <A>content A        |
| <B>content B        |
| </B>                |
| <D>content D        |
| <E>content E        |
| </E>                |
| <F>content F        |
| <G>content G</G>    |
| <G2>content G1</G2> |
| <G3>content G2</G3> |
| </F>                |
| </D>                |
| <C>content C</C>    |
| <C1>content C1</C1> |
| <H>content H        |
| </H>                |
| </A>                |
+---------------------+
17 rows in set (0.00 sec)

mysql>

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #10  
Alt 20.10.2010, 11:19:35
mr_sol mr_sol ist offline
Anfänger
 
Registriert seit: Oct 2010
Beiträge: 19
mr_sol befindet sich auf einem aufstrebenden Ast
AW: NESTED SETS in XML - Gruppierung von Elementen

Du hast recht - lassen wir Lösung 1 weg, wir haben ja eine gut.

Bei der letzten Query hats einen Bug

C,C1 an falscher Position
G zu früh geschlossen

Bin noch nicht dahinter gekommen.

Geändert von mr_sol (20.10.2010 um 11:42:51 Uhr)
Mit Zitat antworten
Antwort

Stichworte
gruppe, nested sets, xml


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
NESTED SETS in XML ausgeben mr_sol MySQL 10 18.10.2010 08:17:02
Nested Sets - Teilbaum zu mehreren Blättern ausgeben Simon1990 PHP Grundlagen 2 28.06.2010 11:12:51
Nested Sets Klasse Socrates PHP Entwicklung und Softwaredesign 26 12.02.2009 00:33:21
Elemente aus Elementen aus Elementen zählen ... thilo MySQL 4 28.12.2006 23:09:32


Alle Zeitangaben in WEZ +2. Es ist jetzt 03:45:22 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.


© 2001-2016 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt