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 ::

Einführung in XHTML, CSS und Webdesign

Einführung in XHTML, CSS und Webdesign 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:
 
 

Zurück   PHP Forum > SELFPHP > MySQLi/PDO/(MySQL)

MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren

Antwort
 
Themen-Optionen Ansicht
  #11  
Alt 20.10.2010, 12:58:20
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: NESTED SETS in XML - Gruppierung von Elementen

Zitat:
Zitat von mr_sol Beitrag anzeigen
Bei der letzten Query hats einen Bug

C,C1 an falscher Position
G zu früh geschlossen
Stimmt leider, die Haupt-Tags der Sub-Elemente bekommen jetzt auch den flag-wert 3 und werden damit von CASE falsch verarbeitet.

Code:
+-----+------+----+------------+
| tag | flag | pt | desc       |
+-----+------+----+------------+
| C   |    3 |  4 | content C  |
| G   |    3 |  9 | content G  |
Da muss ich noch mal drüber nachdenken.

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #12  
Alt 20.10.2010, 14:02:17
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: NESTED SETS in XML - Gruppierung von Elementen

So, was ein kleiner Spaziergang in der Pause nicht so alles bewirkt...

Ich habe die Tabelle element um eine Spalte ebene_id (1 = Haupt, 2 = Sub ) erweitert, damit die Art der XML-Knoten wieder so klar getrennt ist, wie es mal war.

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,
  ebene_id SMALLINT NOT NULL
  
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Daten für Tabelle `element`
--

INSERT INTO `element` (`id`, `tag`, `desc`, `id_tree`, ebene_id) VALUES
(1, 'A', 'content A', 1, 1),
(2, 'B', 'content B', 2, 1),
(3, 'C', 'content C', 3, 1),
(4, 'D', 'content D', 4, 1),
(5, 'E', 'content E', 5, 1),
(6, 'F', 'content F', 6, 1),
(7, 'G', 'content G', 7, 1),
(8, 'H', 'content H', 8, 1),
(9, 'G2', 'content G1', 7, 2),
(10, 'G3', 'content G2', 7, 2),
(11, 'C1', 'content C1', 3, 2);


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  e.ebene_id = 1        
             
         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  e.ebene_id = 1

         UNION ALL
        
         SELECT e.tag, 3 AS flag, t.lft AS pt, e.`desc`
           FROM tree t
           JOIN element e 
             ON e.id_tree = t.id
          WHERE e.ebene_id = 2
                     
     
        ) r

ORDER BY r.pt, r.tag;

+---------------------+
| xml_teil            |
+---------------------+
| <A>content A        |
| <B>content B        |
| </B>                |
| <C>content C        |
| <C1>content C1</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>                |
| <H>content H        |
| </H>                |
| </A>                |
+---------------------+
19 rows in set (0.02 sec)
Könnte wieder stimmen.

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #13  
Alt 21.10.2010, 08:47:32
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

Morgen Thomas!


Als Morgenmensch habe ich mir deinen Vorschlag gerade durchdacht. Die Idee die Elemententabelle als Stack aufzubauen, liegt im Vermeiden jeglicher Zusatzinformation welche schon in der Tabelle vorhanden ist. Vielleicht denke ich hier zu sparsam.

Das schöne an Deiner Lösung ist, dass das System leicht erweiterbar ist. zB XML Attribute, Bewertung,....

Ich überlege gerade wie man die Performans der beiden Lösungen sinnvoll Testen könnte.
Was denkst Du?


Pseudocode für 1:
Code:
INSERT INTO tree (tag,desc,lft,rgt) VALUES ('Wurzel', 'content Wurzel', 1, 2);


SCHLEIFE ANZAHL DER TESTELEMENTE


rgt=ZUFALL zwischen MIN(lft) und MAX(rgt)


ZUFALL OBERELEMENT
UPDATE tree SET rgt=rgt+2 WHERE rgt >= $RGT;
UPDATE tree SET lft=lft+2 WHERE lft > $RGT;
INSERT INTO tree (tag,desc,lft,rgt) VALUES ('Zufalltext', 'content Zufalltext', $RGT, $RGT +1);

   SCHLEIFE ZUFALL ANZAHL UNTERELEMENT   
   INSERT INTO tree (tag,desc,lft,rgt) VALUES ('Zufalltext', 'content Zufalltext', $RGT, $RGT +1);
   SCHLEIFE END


SCHLEIFE END


grüsse helmut


Gutes Buch über Nested Sets: http://books.google.com/books?id=uw2...page&q&f=false

Geändert von mr_sol (21.10.2010 um 09:15:55 Uhr)
Mit Zitat antworten
  #14  
Alt 21.10.2010, 09:19:13
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

War über die Zeit...so der Rest

Code:
MAXELEMENTE=10000
ELEMENTE=0
INSERT INTO tree (tag,desc,lft,rgt) VALUES ('Wurzel', 'content Wurzel', 1, 2);


SCHLEIFE


$RGT=ZUFALL zwischen MIN(lft) und MAX(rgt)


ZUFALL OBERELEMENT
UPDATE tree SET rgt=rgt+2 WHERE rgt >= $RGT;
UPDATE tree SET lft=lft+2 WHERE lft > $RGT;
INSERT INTO tree (tag,desc,lft,rgt) VALUES ('Zufalltext', 'content Zufalltext', $RGT, $RGT +1);
ELEMENT=ELEMENT+1

   SCHLEIFE ZUFALL ANZAHL UNTERELEMENT   
   INSERT INTO tree (tag,desc,lft,rgt) VALUES ('Zufalltext', 'content Zufalltext', $RGT, $RGT +1);
   ELEMENT=ELEMENT+1
   SCHLEIFE END


ABBRUCH ELEMENT>=MAXELEMENT
SCHLEIFE END
Mit Zitat antworten
  #15  
Alt 21.10.2010, 09:32:24
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: NESTED SETS in XML - Gruppierung von Elementen

Hallo Helmut,

was für Performance möchtest Du messen?

a) Die Geschwindigkeit wie lange das Bearbeiten (INSERT,UPDATE,DELETE) dauert
b) Die Geschwindigkeit wie lange das Lesen (SELECT) dauert

Weiterhin ist mir noch nicht klar, ob die Tabelle nur ein "XML-Dokument" enthalten soll oder mehrere? Der bisherige SQL liest die Tabelle komplett aus.

Erzeuge Dir ein (PHP-)Skript, das eine große Menge an nachvollziehbaren Testdaten erzeugt. Dann läßt sich die Performance zu erkennen.

Je nach Anforderung müssen auch noch passende Indices erzeugt werden. Diese helfen MySQL beim Finden der Daten und beschleunigen die Abfrage.

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #16  
Alt 21.10.2010, 09:54:11
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

Hallo Thomas!

Du hast recht, habe nur die halbe Information von mir gegeben.

Die Geschwindigkeit wie lange das Lesen (SELECT) dauert ist mir wichtig. Der Pseudocode
dient ausschliesslich zum füllen der dB. Die Schreibgeschwindigkeit ist Nebensache.


Zitat:
Weiterhin ist mir noch nicht klar, ob die Tabelle nur ein "XML-Dokument" enthalten soll oder mehrere?
Das Ziel der kompletten Query und des Projektes ist eine Mindmap bei welcher mehrer Bäume miteinander verbunden werden unter Berücksichtigen der History. Ich wollte aus Übersichtlichkeit dazu einen neuen Thread anlegen. (Habe hinzu schon eine Lösung überlegt)

Da wir bisher zwei Lösungswege haben - ist die Frage ob der Performancetest erst mit Abschluss der Komplettlösung zu machen ist?

grüsse helmut
Mit Zitat antworten
  #17  
Alt 21.10.2010, 11:25:49
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: NESTED SETS in XML - Gruppierung von Elementen

Zitat:
Zitat von mr_sol Beitrag anzeigen
Da wir bisher zwei Lösungswege haben - ist die Frage ob der Performancetest erst mit Abschluss der Komplettlösung zu machen ist?
Allgemein:
Performance sollte während des ganzen Projektablaufes bedacht werden. Aber trotzdem gilt:

a) Erst muss das Programm korrekt laufen
b) Dann kann man es schneller machen

Ein schnelles Programm das nicht korrekt funktioniert hat vermutlich weniger Akzeptanz als eines das zwar langsam ist, aber korrekt arbeitet.

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #18  
Alt 21.10.2010, 12:43:54
mr_sol mr_sol ist offline
Anfänger
 
Registriert seit: Oct 2010
Alter: 58
Beiträge: 19
AW: NESTED SETS in XML - Gruppierung - Zusammenfassung

Zuerst möchte ich mich bei Dir bedanken, dass Du deine Zeit und SQL-Wissen zur Verfügung stellst.

Nochmals Danke für die Hilfe

Da die meisten Thread mit einem "ich kenne mich jetzt aus" ohne Zusammenfassung Enden, hier alles Notwendige für den Interessierten.


Grupperung von Nested Sets: Vorteil bei bei UPDATE da nicht der komplette Baum abgearbeitet wird. Bzw weniger Konflikte bei mehreren USER.
(besteht aus Oberelement/Unterelemente)

Lösung 1 (reine Lehre) mit Testdaten
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');




 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;


Lösung 2 (Trennen von baumstruktur und Content) mit Testdaten
(Oberelemente 1/Unterelemente2)

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,
  ebene_id SMALLINT NOT NULL
  
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Daten für Tabelle `element`
--

INSERT INTO `element` (`id`, `tag`, `desc`, `id_tree`, ebene_id) VALUES
(1, 'A', 'content A', 1, 1),
(2, 'B', 'content B', 2, 1),
(3, 'C', 'content C', 3, 1),
(4, 'D', 'content D', 4, 1),
(5, 'E', 'content E', 5, 1),
(6, 'F', 'content F', 6, 1),
(7, 'G', 'content G', 7, 1),
(8, 'H', 'content H', 8, 1),
(9, 'G2', 'content G1', 7, 2),
(10, 'G3', 'content G2', 7, 2),
(11, 'C1', 'content C1', 3, 2);


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  e.ebene_id = 1        
             
         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  e.ebene_id = 1

         UNION ALL
        
         SELECT e.tag, 3 AS flag, t.lft AS pt, e.`desc`
           FROM tree t
           JOIN element e 
             ON e.id_tree = t.id
          WHERE e.ebene_id = 2
                     
     
        ) r

ORDER BY r.pt, r.tag;

Links für Nested Sets
http://www.bittermonk.com/
http://joecelkothesqlapprentice.blog...?q=nested+sets
http://www.baoxuehao.cn/index.php/archives/484
http://www.klempert.de/nested_sets/
http://phpperformance.de/nested-sets...eume-in-mysql/


grüsse helmut


Ich würde mich freuen wenn Du mir noch bei Teil 3 meines Problem helfen könntest.


http://www.selfphp.de/forum/showthre...636#post138636

Geändert von mr_sol (21.10.2010 um 12:57: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 MySQLi/PDO/(MySQL) 10 18.10.2010 09:17:02
Nested Sets - Teilbaum zu mehreren Blättern ausgeben Simon1990 PHP Grundlagen 2 28.06.2010 12:12:51
Nested Sets Klasse Socrates PHP Entwicklung und Softwaredesign 26 12.02.2009 01:33:21
Elemente aus Elementen aus Elementen zählen ... thilo MySQLi/PDO/(MySQL) 4 29.12.2006 00:09:32


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:41:46 Uhr.


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


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