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 05-08-2004, 12:34
mydani
 Newbie
Links : Onlinestatus : mydani ist offline
Registriert seit: Aug 2004
Beiträge: 6
mydani ist zur Zeit noch ein unbeschriebenes Blatt
Standard Nested Set Baum Problem

Hi,

ich benutze derzeit eine Baumstruktur nach dem Nested Set Modell, will nun aber bei meiner Abfrage eine Spalte mit dem Inhalt "PARENT ID" ergänzen.
Gibt es dazu eine sinnige Abfrage? Ich komm vielleicht einfach nur nicht auf den richigen Dreh. (Anm.: Vor der GROUP BY Funktion stehen die PARENT IDs noch in der Tabelle).

Statement:

Code:


select * from nestedset a, nestedset b
where a.left between b.left and b.right
group by a.left


Gruß Daniel
Mit Zitat antworten
freelancermap.de - IT Projektvermittlung für Selbständige und Freiberufler
  #2 (permalink)  
Alt 05-08-2004, 13:12
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

welcome.

Wozu brauchst du die parent_id. das ist eigentlich viel mehr die frage...

müsste aber einfach zu machen sein. allerdings nicht rein SQL-seitig, vermute ich. ist die frage was du haben willst.

du machst dir eine abfrage mit id,left und right und speicherst das ganze in nem array. dann durch läufst du das array, und holst dir dabei die entsprechenden parents raus. bedingung dafür darfst du selbst überlegen
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #3 (permalink)  
Alt 05-08-2004, 16:07
mydani
 Newbie
Links : Onlinestatus : mydani ist offline
Registriert seit: Aug 2004
Beiträge: 6
mydani ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ganz einfach, ich hab die Struktur als Nested Set in der Datenbank und benutze aber einen JS-Tree (heißt glaub DTREE), der den Baum per Parentid aufbaut!
Gruß Dani
Mit Zitat antworten
  #4 (permalink)  
Alt 05-08-2004, 20:04
Coragon Rivito
 Master
Links : Onlinestatus : Coragon Rivito ist offline
Registriert seit: Oct 2002
Ort: Mils/AT
Beiträge: 908
Coragon Rivito ist zur Zeit noch ein unbeschriebenes Blatt
Coragon Rivito eine Nachricht über ICQ schicken Coragon Rivito eine Nachricht über AIM schicken Coragon Rivito eine Nachricht über Yahoo! schicken
Standard

wenn du lft als parent_id haben willst ..

Code:
SELECT *, (
 SELECT IFNULL(MAX(link.lft), 0)
  FROM tree AS link
  LEFT JOIN tree AS parent ON (link.lft < parent.lft AND link.rgt > parent.rgt)
  WHERE parent.link = tree.link ) AS parent_id
 FROM tree;
tabellennamen sind natürlich anzupassen ..
__________________
mfg,
Coragon

Geändert von Coragon Rivito (05-08-2004 um 20:07 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 06-08-2004, 07:33
mydani
 Newbie
Links : Onlinestatus : mydani ist offline
Registriert seit: Aug 2004
Beiträge: 6
mydani ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich glaub ich mach hier ein konkretes Beispiel für mein Problem, falls es noch jemand braucht und auch nicht gleich drauf kommt:

Hier die Tabelle für die Sets (sorry ist grad für Oracle weil ich auf Arbeit bin, normalerweise benutze ich MySQL - sollte aber keinen Unterschied machen):

Code:
CREATE TABLE tree
    (id                             NUMBER(*,0) NOT NULL,
    left                           NUMBER(*,0) NOT NULL,
    right                          NUMBER(*,0) NOT NULL,
    title                          VARCHAR2(255) NOT NULL)
  PCTFREE     10
  PCTUSED     40
  INITRANS    1
  MAXTRANS    255
  TABLESPACE  eda_datastore
  STORAGE   (
    INITIAL     262144
    NEXT        262144
    PCTINCREASE 0
    MINEXTENTS  1
    MAXEXTENTS  2147483645
  )
Hier die Einträge der Tabelle:

Code:
INSERT INTO tree
(ID,LEFT,RIGHT,TITLE)
VALUES
(1,1,10,'root')
/
INSERT INTO tree
(ID,LEFT,RIGHT,TITLE)
VALUES
(2,6,9,'cat2')
/
INSERT INTO tree
(ID,LEFT,RIGHT,TITLE)
VALUES
(3,3,4,'entry1')
/
INSERT INTO tree
(ID,LEFT,RIGHT,TITLE)
VALUES
(4,7,8,'entry2')
/
INSERT INTO tree
(ID,LEFT,RIGHT,TITLE)
VALUES
(5,2,5,'cat1')
/
Und so sieht der Baum mit select aus:

Code:
select count(*) as depth, lpad(' ', 3*count(*))||a.title,a.id,a.left,a.right
from tree a, tree b
where a.left between b.left and b.right
group by a.left,a.title,a.id,a.right
Ausgabe:

DEPTH LPAD('',3*COUNT(*))||A.TITLE ID LEFT RIGHT
1 root 1 1 10
2 cat1 5 2 5
3 entry1 3 3 4
2 cat2 2 6 9
3 entry2 4 7 8


--

Und nun zum Ziel:
Ich suche die gleiche Ausgabe wie oben, eben nur mit einer neuen Spalte namens parent_id, welche die ID des Elters / Vaters enthält.

Wenn ich beim Select die group by funktion weglasse, bekomme ich ja eine Liste mit jedem Eintrag und seinen Eltern (dazu gehört auch der Eintrag selbst).

--

Der Select von Coragon (Danke!) machts möglich, und zwar werden für jeden Eintrag die Kinder gesucht. Sucht man nun nach einer Parentid für ein bestimmtes Kind, werden die entsprechenden Zeilen selektiert und die Zeile mit dem größten left-Wert ausgewählt. Bingo Danke!

--

Hier der Query für Oracle (irgendwie bin ich zu blöd für den Subselect ein GROUP BY attribut zu finden, also hab ich halt mit AVG aggregiert XD)
Code:
select c.left,c.title,AVG(
(
select MAX(a.left)
from tree a, tree b
where a. left < b.left and a.right > b.right
and b.id = c.id
)) parentid
from tree c, tree d
where c.left between d.left and d.right
group by c.left,c.title

Geändert von mydani (06-08-2004 um 09:21 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 09-08-2004, 10:52
mydani
 Newbie
Links : Onlinestatus : mydani ist offline
Registriert seit: Aug 2004
Beiträge: 6
mydani ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Nun hab ich noch folgendes problem,
mit MySQL < 4.1 gehn keine Subquerys, also bin ich den Umweg über JOINS gegangen:

Code:
SELECT max(c.tree) PARENTID, a.*
FROM tree a, tree b
INNER JOIN tree c, tree d
ON a.id = d.id
WHERE a.left BETWEEN b.left and b.right
AND c.left < d.left
AND c.right > d.right
GROUP BY a.left
Was natürlich jetzt nicht mehr funktioniert ist der count(*), der vorher den Level angezeigt hat - es werden zuviele Zeilen gezählt (die Verknüpfung mit der c,d Tabelle dürfte das sein ) - gibts nen Weg diese Zeilen nicht mitzuzählen?

Gruß Dani
Mit Zitat antworten
  #7 (permalink)  
Alt 09-08-2004, 10:56
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

ich würde sagen, das ganze ist ja eine einmalige sache. speicher parentid in die db ung gut ist.
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #8 (permalink)  
Alt 09-08-2004, 11:30
mydani
 Newbie
Links : Onlinestatus : mydani ist offline
Registriert seit: Aug 2004
Beiträge: 6
mydani ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Na, wenn du die Dynamik mal nicht vergisst - nimm mal an ich lösche nen Knoten oder verschiebe / tausche den.
Dann muss ich die Parent IDs mitwarten, bei nem großen Baum kann das auch lästig werden.
Mit Zitat antworten
  #9 (permalink)  
Alt 09-08-2004, 11:32
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

nicht schlimmer als die lefts und rights zu warten.
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #10 (permalink)  
Alt 09-08-2004, 11:37
mydani
 Newbie
Links : Onlinestatus : mydani ist offline
Registriert seit: Aug 2004
Beiträge: 6
mydani ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Die muss ich ja sowieso warten, aber zusätzlich dann noch die Parents... Außerdem gibts da bestimmt ne passende Funktion bzw. Aggregation ... der Soll einfach den Count erst machen wenn das MAX vorbei ist *Argg*
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

PHP Marktplatz-Software
PHP Marktplatz-SoftwareEs hat sich viel getan! Die neue Version 7.5.9 unserer PHP Marktplatz-Software ebiz-trader steht ab sofort zur Verfügung.

28.10.2019 | Berni

Die RIGID-FLEX-Technologie
Die RIGID-FLEX-TechnologieDie sogenannte "Flexible Elektronik" , oftmals auch als "Flexible Schaltungen" bezeichnet, ist eine zeitgemäße Technologie zum Montieren von elektronischen Schaltungen.

06.12.2018 | Berni


 

Aktuelle PHP Scripte

SMT

Server Monitoring & Management Tool Das SMT wurde von einem Administrator für Administratoren entwickelt, es vereinfacht den Alltag in der klassischen Administration und Verwaltung. Mit dem SMT kannst Du alle Deine Server & Dienste verwalten und überwach

04.09.2020 palle_1977 | Kategorie: PHP
numaeks Web-Farbmixer

Die RGB-Farben lassen sich hier auf unterschiedliche Weise mischen. Zur Einstellung werden auch die Dreh- und Schieberegler mit Canvas verwendet. Gespeichert werden die Farben in einem Cookie.

04.09.2020 numaek | Kategorie: JAVASCRIPT/ Tools
phplinX-Erotikportal 4 ansehen phplinX-Erotikportal 4

Erweiterbares Portal speziell für Erotik mit den Modulen Webkatalog, Bannermanagement und Kleinanzeigenmarkt. Sämtliche Module können über einen einzigen Adminbereich verwaltet werden.

18.06.2020 Cosinus14 | Kategorie: PHP/ Anzeigenmarkt
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:52 Uhr.