php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 17-12-2007, 09:23
Postaria
 Registrierter Benutzer
Links : Onlinestatus : Postaria ist offline
Registriert seit: Mar 2004
Beiträge: 100
Postaria ist zur Zeit noch ein unbeschriebenes Blatt
Standard Mehrere Wurzeln bei Nested Sets

ist eventuell ein leidiges Thema was ich so rauskriege bei dem Suchbegriff Nested Sets aber ...

Ich habe das Prinzip verstanden und verwende es bereits ...
nun möchte ich aber eine 2te Wurzelkategorie erstellen und ebenfalls die knotenpunkte der 1ten Wurzel einfügen können.

jedoch sollte ebenfalls möglich sein diese 2te Wurzelkategorie mitsammt der Knotenpunkte der 1ten Wurzel in einer bestimmten Ebene abzulegen.


So sollte das Grundgerüßt aussehen:
Wurzelkat1
|---Knotenp1
|++++|-Blatt1
|++++|-Blatt2
|---Knotenp2
|++++|-Blatt3

Wurzelkat2
|++++|-Blatt1
|++++|-Blatt2
|---Knotenp2
|++++|-Blatt3

Am Ende solls so aussehen

Wurzelkat1
|---Knotenp1
|++++|-Blatt1
|++++|-Wurzelkat2
|++++|+++|-Blatt1
|++++|+++|-Blatt2
|++++|+++|---Knotenp2
|++++|+++++++|-Blatt3
|++++|-Blatt2
|---Knotenp2
|++++|-Blatt3



Hoffe mein zeichnerisches können veranschaulicht ungefair das was ich beabsichtige zu fragen..

das Tut von kempert http://www.klempert.de/nested_sets/artikel/ ist da schon wesentlich leicht und verständlich erklärt nur wird immer davon ausgegangen das es nur eine Wurzel gibt....

Hoffe ihr könnt mir da etwas auf die Sprünge helfen
danke ....
Mit Zitat antworten
  #2 (permalink)  
Alt 17-12-2007, 09:52
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Wenn ich dich richtig verstehe, gibt es ja auch bei dir nur eine Wurzel. Durch das Einfügen ins erste Set wird ja aus Wurzelkat2 ein ganz normaler Knoten. Das sieht dann in deiner Notation etwa so aus:
Code:
Wurzelkat1
|---Knotenp1
|++++|-Blatt1.1
|++++|-Knotenp1.1 (ex Wurzelkat2)
|++++|+++|-Blatt1.1.1
|++++|+++|-Blatt1.1.2
|++++|+++|---Knotenp1.1.1
|++++|+++++++|-Blatt1.1.1.1
|++++|-Blatt1.2
|---Knotenp2
|++++|-Blatt2.1
__________________
Gruss
H2O
Mit Zitat antworten
  #3 (permalink)  
Alt 17-12-2007, 09:57
unset
  Moderator
Links : Onlinestatus : unset ist offline
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.782
unset befindet sich auf einem aufstrebenden Ast
Standard

Willst du einem Element in mehrere Sets legen? Wenn nein, dann verstehe ich dein Problem leider nicht ganz (deine "Zeichnung" scheint nämlich etwas inskonsistent).

Am besten, du erklärst dein Problem auch an konkreten Beispielen. Was soll eine Wurzelkategorie sein, was ein Knotenpunkt (eigentlich ist jedes Element in einem Nested Sets Baum ein Knotenpunk) und was die Blätter.
Mit Zitat antworten
  #4 (permalink)  
Alt 17-12-2007, 10:59
Postaria
 Registrierter Benutzer
Links : Onlinestatus : Postaria ist offline
Registriert seit: Mar 2004
Beiträge: 100
Postaria ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Stimmt wenn ichs mir so recht überlege habe ich mich missverständlich ausgedrückt
im prinzip möchte ich gerne nur eine Tabelle haben die aber mehrere Wurzeln hat , diese wurzeln ich aber im nachhinein miteinander verknüpfen möchte.. im konkreten Bsp.

ich habe eine Gruppe Autos und eine Gruppe Menschen
laut nested set kann ich aber diese beiden Gruppen nicht jeweils als Wurzel in einer Tabelle halten, da man ja davon ausgeht das die wurzel immer = 1 ist
bsp.:

Tabelle tree
id name lft rgt
----------------------
| 1 | Gruppe1 | 1 | 2 |

füge ich nun eine Untergruppe in die Gruppe1 so sieht das ganze ja so aus :
Tabelle tree
id name lft rgt
----------------------
| 1 | Gruppe1 | 1 | 4 |
----------------------
| 2 | Ugruppe | 2 | 3 |

somit ist ja sichergestellt das der Wert des tree.name die Wurzel ist wo lft = 1 ..

was aber wenn ich mehrere Wurzeln haben möchte ?
z.bsp.:
Tabelle tree
id name lft rgt
----------------------
| 1 | Gruppe1 | 1 | 4 |
----------------------
| 2 | Ugruppe | 2 | 3 |

und
| 3 | Gruppe2 | 1 | 4 |
----------------------
| 4 | Ugruppe1| 2 | 3 |

Punkt1.: Wie muss ich rgt und lft werte verändern damit ich immer weiß was denn nun wurzel ist ?
Punkt2.: Wie kann ich sicherstellen das ich die Gruppe2, die ja eigentlich ein Wurzelelement ist mit einer Ugruppe ist, in das Wurzelelement der Gruppe1 einfügen kann ?
Mit Zitat antworten
  #5 (permalink)  
Alt 17-12-2007, 11:15
unset
  Moderator
Links : Onlinestatus : unset ist offline
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.782
unset befindet sich auf einem aufstrebenden Ast
Standard

Also, erstmal ist es uninterssant, welche "id" die Wurzel hat. Genaugenommen muss der Links-Wert nichtmal 1 sein. Wichtig ist nur, dass alle Kindelemente einen höheren Linkswert haben.

Dein Problemn lässt sich doch ganz einfach lösen:

Code:
id | name                       | links | rechts
------------------------------------------------
1  | Wurzel                     | 1     | 14
2  | Gruppe 1                   | 2     | 7
3  | Kindelement 1 von Gruppe 1 | 3     | 4
4  | Kindelement 2 von Gruppe 1 | 5     | 6
5  | Gruppe 2                   | 8     | 13
6  | Kindelement 1 von Gruppe 2 | 9     | 10
7  | Kindelement 2 von Gruppe 2 | 11    | 12
Wenn du nun nur Gruppe 1 auslesen willst, nimmst du alle Records der Tabelle, die einen größeren Linkswert als 2 und einen kleineren Rechtswert als 7 haben.

Bei Gruppe zwei dann natürlich Links größer 8 und Rechts kleiner 13.

Das ist ja grade der Sinn von Nested Sets: Gruppenelemente verschachteln.
Mit Zitat antworten
  #6 (permalink)  
Alt 17-12-2007, 12:46
Postaria
 Registrierter Benutzer
Links : Onlinestatus : Postaria ist offline
Registriert seit: Mar 2004
Beiträge: 100
Postaria ist zur Zeit noch ein unbeschriebenes Blatt
Standard

im prinzip haste ja recht jetzt möchte ich aber die Gruppenbehandlung so einfach stricken wie möglich ..

möchte ich jetzt laut deiner Tabelle eine neue Gruppe einfügen müsste ich bei allen Einträgen die unter Wurzel sind die links und rechts Werte ändern.

genauso beim löschen einer Gruppe oder Verschieben einer Gruppe und so weiter ...

Wenn ich jedoch es hinbekomme das ich eine Wurzel habe die alleine für ist so umgehe ich bei 50 oder 100 Gruppen immer wieder die Tabelle neu zu ordnen.
verstehste was ich meine ?
Mit Zitat antworten
  #7 (permalink)  
Alt 17-12-2007, 12:58
unset
  Moderator
Links : Onlinestatus : unset ist offline
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.782
unset befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von Postaria
im prinzip haste ja recht jetzt möchte ich aber die Gruppenbehandlung so einfach stricken wie möglich ..

möchte ich jetzt laut deiner Tabelle eine neue Gruppe einfügen müsste ich bei allen Einträgen die unter Wurzel sind die links und rechts Werte ändern.

genauso beim löschen einer Gruppe oder Verschieben einer Gruppe und so weiter ...

Wenn ich jedoch es hinbekomme das ich eine Wurzel habe die alleine für ist so umgehe ich bei 50 oder 100 Gruppen immer wieder die Tabelle neu zu ordnen.
verstehste was ich meine ?
Ja, aber das wirst du nicht umgehen können. Denn entweder du arbeitest mit Nested Sets und liest performant aus, oder du strickst dir das Prinzip so um, dass du ressourcenfressend einlesen musst (denn du musst dir dann die Links- und Rechtswerte trotzdem berechnen, wenn du deinen Baum haben willst - was in einem Kolbenfresserquery oder hundert kleinen Queries geschehen wird) aber schnell und einfach ändern kannst. Das ist aber nicht nur deswegen eine Milchmädchenrechnung, weil du eh öfter lesen als schreiben wirst, sondern auch, weil du die Unterbäume trotzdem genau so aufwändig wie einen großen manipulieren musst, wenn sich etwas ändert.
Mit Zitat antworten
  #8 (permalink)  
Alt 17-12-2007, 13:18
Postaria
 Registrierter Benutzer
Links : Onlinestatus : Postaria ist offline
Registriert seit: Mar 2004
Beiträge: 100
Postaria ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ja die links und rechts werde muss ich natürlich ändern sobald ein Element einer Wurzel hinzugefügt wird. Jedoch muss ich ja dann nur DIE links und rechtswerte ändern die auch zu der jeweiligen wurzel gehören ...

ich bin grade dabei eine Tabelle aufzubauen die mir eventuell bei meiner Idee behilflich sein kann ...

folgenden Aufbau habe ich mir überlegt ...

id wurzel_id name lft rgt
----------------------------------------
1 | 1 | Gruppe1 | 1 | 10 |
2 | 1 | Ugruppe1 | 2 | 3 |
5 | 1 | Ugruppe2 | 4 | 5 |
6 | 1 | Ugruppe3 | 6 | 7 |
7 | 1 | Ugruppe4 | 8 | 9 |
---
3 | 2 | Gruppe1 | 1 | 10 |
4 | 2 | Ugruppe1 | 2 | 3 |
8 | 2 | Ugruppe2 | 4 | 5 |
9 | 2 | Ugruppe3 | 6 | 7 |
10 | 2 | Ugruppe4 | 8 | 9 |


Mal schauen ob mir das irgendwie weiterhilft
bei der handhabung ..
Mit Zitat antworten
  #9 (permalink)  
Alt 17-12-2007, 14:04
unset
  Moderator
Links : Onlinestatus : unset ist offline
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.782
unset befindet sich auf einem aufstrebenden Ast
Standard

So wirst du aber nicht mehr den gesamten Baum (perfomant) einlesen können.
Mit Zitat antworten
  #10 (permalink)  
Alt 17-12-2007, 14:27
Postaria
 Registrierter Benutzer
Links : Onlinestatus : Postaria ist offline
Registriert seit: Mar 2004
Beiträge: 100
Postaria ist zur Zeit noch ein unbeschriebenes Blatt
Standard

es ist in dem sinne ja auch nicht ein Baum sondern 2 Bäume
und wenn ich einem der Bäume einen AST hinzufügen möchte dann geschieht das auch nahtlos ohne die anderen Bäume zu stören.
So kann ich auch alle Bäume mit deren Ästen anzeigen und deren Blättern usw.

So ist zumindestens die Theorie

aber hmm ... an der Praxis wie mir scheint happerts bei mir grade ..
Mit Zitat antworten
  #11 (permalink)  
Alt 17-12-2007, 14:58
unset
  Moderator
Links : Onlinestatus : unset ist offline
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.782
unset befindet sich auf einem aufstrebenden Ast
Standard

:sigh: Na, ein drittes mal werde ich es dir nicht sagen. Nur soviel: Du hast das Konzept von Nested Sets nicht vollständig verstanden.
Mit Zitat antworten
  #12 (permalink)  
Alt 02-03-2014, 17:28
kcyberbob
 Registrierter Benutzer
Links : Onlinestatus : kcyberbob ist offline
Registriert seit: Oct 2003
Beiträge: 7
kcyberbob ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich hab das Prinzip verstanden, er will einfach nur in einer Datenbank Tabelle mehrer Menü´s eintragen (zB. Main Menü, Footer Menü, usw...)

Ich würde auch gerne wissen wie das SQL dann aussieht.

Code:
SELECT
n.id, n.menu, n.name, n.link, COUNT(*)-1 AS level
FROM
`menu` AS n,
`menu` AS p
WHERE
n.left BETWEEN p.left AND p.right
GROUP BY n.left
ORDER BY n.left
So jetzt müsste man nur noch irgendwie in der WHERE Bedingung einfügen menu='main' oder halt 'footer'

Aber ich bekomme es auch nicht ganz hin...
Mit Zitat antworten
  #13 (permalink)  
Alt 03-03-2014, 11:06
Benutzerbild von Berni Berni
  OWNER
Links : Onlinestatus : Berni ist offline
Registriert seit: Jan 2001
Ort: Frankfurt / Egelsbach
Beiträge: 6.306
Blog-Einträge: 6
Berni befindet sich auf einem aufstrebenden Ast
Standard

hier gibt es noch ein Tutorials zum thema Nested Sets mit mySQL

Das 'Nested Sets' Modell - Bäume mit SQL PHP Tutorials nicht nur für Anfänger php-resource.de
__________________

php-Entwicklung | ebiz-consult.de
PHP-Webhosting für PHP Entwickler | ebiz-webhosting.de
die PHP Marktplatz-Software | ebiz-trader.de
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

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 an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:10 Uhr.