| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

12-11-2007, 13:41
|
|
PHPler
Registrierter Benutzer
|
|
Registriert seit: Oct 2003
Beiträge: 250
|
|
Nested Set: Bestimmten Level abfragen
Hallo!
Ich habe ein Nested Sets System, z.B.
PHP-Code:
Name | LFT | RGT | LEVEL
Root | 1 | 8 | 1
Child | 2 | 5 | 2
Subchild | 3 | 4 | 3
Child 2 | 6 | 7 | 2
Nun möchte ich alle Einträge aus der Datenbank holen, die auf Ebene X liegen, also wenn ich z.B. Ebene 2 angebe, soll mir die Abfrage Child und Child 2 zurückliefern.
Wie stell ich das an? Frickel schon die ganze Zeit an einer Abfrage rum, komm aber kein Stück weiter. Danke!
|

12-11-2007, 14:25
|
 |
Berni
  OWNER
|
|
Registriert seit: Jan 2001
Ort: Frankfurt / Egelsbach
Beiträge: 6.206
|
|
"select * from bla where LEVEL = 2"
|

12-11-2007, 14:32
|
|
hhcm
PHP Senior
|
|
Registriert seit: Jun 2005
Ort: Viersen, NRW
Beiträge: 1.829
|
|
OffTopic:
__________________
gruss Chris
Derjenige, der sagt: "Es geht nicht", soll den nicht stoeren, der's gerade tut."
|

12-11-2007, 14:57
|
|
PHPler
Registrierter Benutzer
|
|
Registriert seit: Oct 2003
Beiträge: 250
|
|
*lol* sorry, ihr habt mich falsch Verstanden!
Level steht da nur als Beispiel. Es ist KEIN Element der Tabelle (hätte ich villeicht dazuschreiben sollen). Mit der folgenden Abfrage
SELECT db1.name AS name, COUNT(*) AS level FROM tabelle AS db1, TABELLE AS db2 WHERE db1.lft BETWEEN db2.lft AND db2.rgt GROUP BY db1.lft ORDER BY db1.lft, db1.rgt
Wird automatisch der Level zu jedem Eintrag berechnet. Nun möchte ich aber nur die Einträge haben, denen Level x entspricht. Nur funzt das weder wenn ich in die WHERE klausel z.B. WHERE level = 2 noch WHERE COUNT(*) = 2 oder sonstiges reinhau.
Also wie muß da die Abfrage umgestrickt werden?
|

12-11-2007, 15:10
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Mit ALTER TABLE eine Spalte "Level" hinzufügen und dein SELECT von oben zu einem UPDATE umbauen. Dann löst Bernis Query dein Problem.
|

12-11-2007, 15:13
|
|
PHPler
Registrierter Benutzer
|
|
Registriert seit: Oct 2003
Beiträge: 250
|
|
Hm, stimmt auch. Werd ich gleich mal probieren. Danke!
|

12-11-2007, 15:26
|
unset
 Moderator
|
|
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.778
|
|
In einer größeren Anwendung löse ich das Problem über eine zusätzliche Spalte, in der ich den Pfad noch einmal vorhalte. So kann man auch schnell von unten nach oben auflösen:
Code:
Name | ID | LFT | RGT | PATH
Root | 0 | 1 | 8 |
Child | 1 | 2 | 5 | 0
Subchild | 2 | 3 | 4 | 0-1
Child 2 | 3 | 6 | 7 | 0
Geändert von unset (12-11-2007 um 15:28 Uhr)
|

12-11-2007, 16:08
|
|
zaubatrik
Newbie
|
|
Registriert seit: Aug 2006
Beiträge: 22
|
|
Um das Problem zu lösen must Du nur noch ein "HAVING level = 2" an deine bereits vorhandene Query anhängen.
Code:
SELECT db1.name AS name, COUNT(*) AS level FROM tabelle AS
db1, TABELLE AS db2 WHERE db1.lft BETWEEN db2.lft AND db2.rgt
GROUP BY db1.lft HAVING level = 2 ORDER BY db1.lft, db1.rgt
Dadurch brauchst Du auch keine extra Spalte in deiner Tabelle und das "geniale" an Nested-Sets - welche Du ja verwendest - wird sichtbar.
Schöne Grüße
zaubatrik
|

12-11-2007, 16:12
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Die zusätzliche Spalte würde genau das selbe leisten wie ein HAVING. Aber man würde nicht bei jeder Anfrage eine Query mit JOIN, BETWEEN, GROUP BY und ORDER ausführen, sondern nur bei INSERTS und UPDATES.
Wenn also oft nach Einträgen mit bestimmtem Level gefragt wird, würde ich mir den Luxus einer zusätzlichen int-Spalte gönnen.
Wenn andererseits oft Daten verändert werden, würde ich wiederum HAVING bevorzugen.
|

12-11-2007, 17:03
|
|
PHPler
Registrierter Benutzer
|
|
Registriert seit: Oct 2003
Beiträge: 250
|
|
Ach siehste! Das mit dem HEAVING wusst ich nicht. Denke aber in dem Fall macht es auch mehr sinn die Abfrage mit einer extra Tabelle zu machen, auch wenn ich jedesmal die Levels neu updaten müsste beim hinzufügen, verschieben oder entfernen von Einträgen. Aber gut zu wissen für den fall, falls ich das HEAVING mal anderweitig brauchen sollte. Danke!
|

12-11-2007, 18:50
|
|
zaubatrik
Newbie
|
|
Registriert seit: Aug 2006
Beiträge: 22
|
|
Nested-Sets zeichen sich doch aber gerade dadurch aus das ich mit ener Query ganze Bäume abbilden kann. Aber wie dem auch sei, es führen viele Wege nach Rom.
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| 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.
HTML-Code ist aus.
|
|
|
|
PHP News
|