Antwort
 
Themen-Optionen
Alt 12.08.2006, 19:45 Nach oben    #1
Benutzer
 
Registriert seit: 05.12.2005
Beiträge: 62
Standard Fiese SQL-Abrage

Hallo,

ich hab eine Tabelle (wow!) in der sowas wie Verzeichnisse gespeichert sind. Die Tabelle hat etwa folgenden Inhalt:

ID NAME PARENT_ID
---------------------------
1 Verzeichnis 1 0
2 Verzeichnis 2 0
3 Verzeichnis 3 1
4 Verzeichnis 4 1
5 Verzeichnis 5 1
6 Verzeichnis 6 2
7 Verzeichnis 7 0
8 Verzeichnis 8 4
...

PARENT_ID = 0 bedeutet hier, dass dieses Verzeichnis quasi im ROOT-Verzeichnis liegt, also kein Verzeichnis als "Vater" hat. Verzeichnisse im ROOT sind also Verzeichnis 1, 2 und 7.
Verzeichnis 3, 4 und 5 liegen innerhalb von Verzeichnis 1, Verzeichnis 6 in Verzeichnis 2, Verzeichnis 8 in 4 usw. also ganz einfach...

Nun möchte ich - wenn möglich in einer Abfrage eine Verzeichnisliste in etwa der Form

Code:
Verzeichnis 1
  Verzeichnis 3
  Verzeichnis 4
    Verzeichnis 8
  Verzeichnis 5
Verzeichnis 2
  Verzeichnis 6
Verzeichnis 7
...


haben. Ich hab nur leider keine Schimmer, wie ich an die Sache rangehen sollte... Habt ihr vll. irgend eine Idee? BTW: Ich benutze (immernoch) MySQL 4.1.10

Bin für jeden Hint dankbar
Lg
sayang
Sayang ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.08.2006, 22:52 Nach oben    #2
Benutzer
 
Registriert seit: 20.08.2005
Beiträge: 91
Standard

SELCTE alles und mach eine Rekursion
Homepagespeicher ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.08.2006, 21:34 Nach oben    #3
Blubb... öfz
 
Benutzerbild von ljungi
 
Registriert seit: 16.03.2006
Ort: Berlin
Beiträge: 419
Standard

Das wäre die einfachste Lösung, aber auch der Tod für jeden Ressourcenarmen Server...

Nur weiß ich selber auch keine bessere Lösung als ne andere Struktur (Baumstruktur mit Knoten...)

Ist aber wesentlich umständlicher!
__________________
Vive la France! Welcome to Sarkoworld...
ljungi ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.08.2006, 13:02 Nach oben    #4
flupsi
Gast
 
Beiträge: n/a
Standard

...ich würde die Verzeichnisse, die eine Parent_ID haben, schon einmal grundsätzlich in eine eigene Tabelle auslagern.
Die Spalte Parent-ID bei der ersten Tabelle, welche die Haupt-Verzeichnisse enthält, entfällt dann.

Stichwort "normalisierung"

Das Ganze fragst Du dann über ein Join ab.

Geändert von flupsi (14.08.2006 um 13:06 Uhr).
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.08.2006, 13:45 Nach oben    #5
Johannes Müller
 
Benutzerbild von $traight-$hoota
 
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 508
Standard

Zitat:
Zitat von flupsi
...ich würde die Verzeichnisse, die eine Parent_ID haben, schon einmal grundsätzlich in eine eigene Tabelle auslagern.
Die Spalte Parent-ID bei der ersten Tabelle, welche die Haupt-Verzeichnisse enthält, entfällt dann.

Stichwort "normalisierung"

Das Ganze fragst Du dann über ein Join ab.
ja rofl das bringt aber auch net wirklich viel, wenn du eine tief verschachtelte baumstruktur hast...

eine alternative zu parent_id zur abbildung von bäumen sind sogenannte nested sets
NestedSets - Das visuelle Modell - develnet.org
__________________
Weißt Bescheid - Scheiß wie weit
$traight-$hoota ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.08.2006, 13:53 Nach oben    #6
flupsi
Gast
 
Beiträge: n/a
Standard

wenn, wenn, wenn....

gehe ich von dem Modell aus, welches oben angezeigt wird, ist es schon sinnvoll.
Natürlich gibt es kein Patentrezept. Es kommt nicht nur auf die Tiefe der Verschachtelung an, sondern auch darauf, wieviele Verzeichnisse insgesamt in der Tabelle landen sollen / werden.
....das weiss aber nur Sayang allein
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.08.2006, 14:44 Nach oben    #7
Johannes Müller
 
Benutzerbild von $traight-$hoota
 
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 508
Standard

Zitat:
Zitat von flupsi
gehe ich von dem Modell aus, welches oben angezeigt wird, ist es schon sinnvoll.
Natürlich gibt es kein Patentrezept. Es kommt nicht nur auf die Tiefe der Verschachtelung an, sondern auch darauf, wieviele Verzeichnisse insgesamt in der Tabelle landen sollen / werden.
....das weiss aber nur Sayang allein
und hat sayang gesagt, wie sein baum aussehen wird? er hat lediglich ein beispiel wie er sein könnte geschrieben.
natürlich kommt es letztendlich darauf an, ob es ein tief verschachtelter baum ist und ob viele änderungen daran durchgeführt werden.
__________________
Weißt Bescheid - Scheiß wie weit
$traight-$hoota ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.08.2006, 19:34 Nach oben    #8
flupsi
Gast
 
Beiträge: n/a
Standard

Zitat:
und hat sayang gesagt, wie sein baum aussehen wird?

Wenn Du mich schon immer verbessern must, dann lies doch bitte meine Postings richtig durch.
Zitat:
....das weiss aber nur Sayang allein
Aber damit Du Deine Ruhe hast...Dein Vorschlag ist natürlich viel besser, und ich habe keine Ahnung. Mann,mann,mann...
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.08.2006, 20:59 Nach oben    #9
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 684
Standard

Ihr habt da noch was vergessen: [/Kindergarten]

Zum Thema Normalisierung wüsste ich gerade nicht, ob es dieser entsprechend verstößt in einer Tabelle auf die selbe Tabelle einen Fremdschlüssel zu legen, das müsste ich in der Tat nachlesen - wenn ich irgendwann mal die Zeit dazu habe.

Aebr ich will euch ja lieber beide demütigen (bitte nicht ernst nehmen ) und euch eine Lösung zwischen den euren Präsentieren:

Eine Tabelle mit den Verzeichnissen ohne die Spalte Parent_ID und eine Tabelle mit 2 Spalten: Parent_ID und Child_ID. Ha, nun hab ich es euch aber gezeigt, endlose Tiefen und das in der gewünschten 2-Tabellen-Normal-Form *scnr*
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.08.2006, 22:41 Nach oben    #10
Benutzer
 
Registriert seit: 05.12.2005
Beiträge: 62
Standard

So...
erstmal vielen Dank für die Tipps... ich hab jetzt irgendwie aus allem etwas entnommen

Tabelle 'folder':
ID NAME
----------------
1 Verzeichnis 1
2 Verzeichnis 2
3 Verzeichnis 3
4 Verzeichnis 4
5 Verzeichnis 5
6 Verzeichnis 6
7 Verzeichnis 7
8 Verzeichnis 8



Tabelle 'foldermapping'
ID PARENT
----------
1 0
2 0
3 1
4 1
5 1
6 2
7 0
8 4


Dann hab ich mit
SELECT f.id, f.name, m.parent FROM folder f, foldermapping m WHERE f.id=m.child ORDER BY m.parent, f.name
eine Liste bekommen, die nach der Parent-ID sortiert war. Diese Items hab ich nach und nach eingelesen, Folder-Objekte erzeugt, diese mit ihrer ID als Schlüssel in eine Hashmap (die brauch ich nur zum aufbau) gepackt. Die Folder-Objekte selbst verfügen über eine Collection, in der die Subfolder gespeichert werden können.
Code:
HashMap foldermap = new HashMap();
Folder root = new Folder("");
foldermap.put(new Integer(0), root);
        
Connection conn = null;
ResultSet rs = null;
Statement stmt = null;
String output = "";

try {
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    conn = DriverManager.getConnection("jdbc:mysql://"
            + host + "/" + db + "?user=" + user + "&password=" + pass);
    stmt = conn.createStatement();
    rs = stmt.executeQuery(
            "SELECT f.id AS id, f.name AS name, m.parent AS parent " +
            "FROM link_folders f, link_foldermapping m " +
            "WHERE f.id=m.child ORDER BY m.parent, f.name");
    //int i = 0;
            
    while (rs.next()) {
        int f_id = rs.getInt("id");
        String name = rs.getString("name");
        int p_id = rs.getInt("parent");
        Folder tmp = new Folder(name);
        foldermap.put(new Integer(f_id), tmp);
        Folder parent = (Folder)foldermap.get(new Integer(p_id));
        parent.addSubFolder(tmp);
        //i++;
    }
Die Ausgabe läuft mit einer rekursiven Methode
Code:
private void listFolders(Folder root, String intend, PrintWriter out) {
    out.println(intend+root.getFolderName()+"<br/>");
    Folder[] subfolders = root.getSubFolders();
    for(int i=0; i<subfolders.length; i++) {
        listFolders(subfolders[i], intend+"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", out);
    }
}
Vielleicht nicht grad ästhetisch aber funktioniert erstmal... vielen Dank nochmal

sayang
Sayang ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.08.2006, 06:26 Nach oben    #11
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 684
Standard

Ähm, nur zur Info: Bei Verzeichnissen, die im Root liegen, macht ein Eintrag in der Tabelle 'foldermapping' keinen wirklichen Sinn. Du kannst sie einfach weglassen, sodass nur dann ein Datensatz in der Tabelle gefunden wird, wenn auch wirklich einer da sein muss.

Allerdings sollte dann aus:

Code:
            "SELECT f.id AS id, f.name AS name, m.parent AS parent " +
            "FROM link_folders f, link_foldermapping m " +
            "WHERE f.id=m.child ORDER BY m.parent, f.name");
das werden:

Code:
            "SELECT f.id AS id, f.name AS name, m.parent AS parent " +
            "FROM link_folders f" +
            "LEFT OUTER JOIN link_foldermapping m ON f.id=m.child" +
            "ORDER BY m.parent, f.name");
Allerdings solltest du nochmal testen, wie sich das auf das ORDER BY auswirkt, da bei Root-Verzeichnissen m.parent der Wert NULL ist. Aber wenn du eh mittels einer Schleife einen Hash erzeugst, ist die Sortierung eventuell ohnehin für die Füße, da müsste eigentlich die Sortierung nach f.name reichen!? Aber so ganz steige ich durch den Code oben auch nicht durch bisher
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.08.2006, 06:50 Nach oben    #12
Benutzer
 
Registriert seit: 05.12.2005
Beiträge: 62
Standard

Das Objekt für den root Folder lege ich quasi manuell an. Von daher ist dafür kein Eintrag in der Tabelle vorhanden. Die Hashmap brauch ich doch um nachzusehen, ob für einen Folder aus der DB bereits vorher ein entsprechender parent Folder eingelesen wurde und diesem parent Folder sein Kind "vorzustellen".
Eine Sortierung nach dem Foldername ist - bei mir - nicht unbedingt sinnvoll, da es ja dann vorkommen kann, dass ich einen Folder aus der DB bekomme, der einen bestimmten parent Folder hat, welcher jedoch noch nicht ausgelesen wurde.
Naja, ist halt eine Quick&Dirty-Lösung. Werd mir heut nachmittag aber mal dein SQL Statement genauer ansehen...

BTW: kennt ihr ne gute Seite, wo das mit den JOINs mal so richtig für Doofe erklärt wird?

Lg
sayang
Sayang ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.08.2006, 08:28 Nach oben    #13
flupsi
Gast
 
Beiträge: n/a
Standard

Zitat:
Ihr habt da noch was vergessen: [/Kindergarten]
...Du hast recht (zerknirscht guck)

Zitat:
Tabelle 'folder':
ID NAME
----------------
1 Verzeichnis 1
2 Verzeichnis 2
3 Verzeichnis 3
4 Verzeichnis 4
5 Verzeichnis 5
6 Verzeichnis 6
7 Verzeichnis 7
8 Verzeichnis 8


Tabelle 'foldermapping'
ID PARENT
----------
1 0
2 0
3 1
4 1
5 1
6 2
7 0
8 4
...sind die ID`s fix?
Wenn sie per "auto_increment" erstellt werden, könnte Deine Aufteilung so vielleicht Probleme im Handling aufwerfen...
Ich weiss ja nicht, ob sich die Verzeichnissnamen auch mal ändern, oder sie verschoben werden können...

Zitat:
BTW: kennt ihr ne gute Seite, wo das mit den JOINs mal so richtig für Doofe erklärt wird?
Es gibt eigentlich eine Menge Seiten, die diesen Sachverhalt zu erklären versuchen.
Mir persönlich geht es meist so, dass eine Seite allein es fast nie schafft, mir etwas zu erklären. Erst nachdem ich mir die Schreibstile und Einzelheiten verschiedener Seiten angetan habe, blitzt dann das Verstehen in meinen Augen auf
Kannst ja vielleicht mal hier anfangen:
http://www.sql-und-xml.de/sql-tutori...-mit-join.html
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.08.2006, 12:45 Nach oben    #14
Johannes Müller
 
Benutzerbild von $traight-$hoota
 
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 508
Standard

is ja toll, dass jetzt alles klappt.
aber mal ne zwischenfrage:

was bringt es denn, die beziehungen zwischen den einzelnen elementen in foldermappings auszulagern, außer dass noch eine weitere tabelle angelegt wird...

btw: leg dir ne oracle datenbank zu. da kann man bäume direkt speichern
__________________
Weißt Bescheid - Scheiß wie weit
$traight-$hoota ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.08.2006, 18:44 Nach oben    #15
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 684
Standard

@shoota: Wieviele Webspaceprovider haben denn bitte eine Oracle-DB am Laufen und wieviele MySQL?
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.08.2006, 19:38 Nach oben    #16
Johannes Müller
 
Benutzerbild von $traight-$hoota
 
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 508
Standard

Zitat:
Zitat von MrNiceGuy
@shoota: Wieviele Webspaceprovider haben denn bitte eine Oracle-DB am Laufen und wieviele MySQL?
hm, naja da gibts auch genug. nur die kosten dann halt *gg*
__________________
Weißt Bescheid - Scheiß wie weit
$traight-$hoota ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


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

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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 aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
SQL, Zahlen auf zwei Stellen mit Nullen auffüllen, vgl. sprintf() Ben Datenbanken 8 21.04.2007 19:32
Abkürzung des Wochentags in SQL, vgl. strftime in PHP Ben Datenbanken 4 12.04.2007 16:51
Zugriff auf Wert des vorhergenden Datensatzes in einer SQL Abfrage Jay Datenbanken 5 17.07.2006 15:25
sql query where .... browse array juergreh PHP-Programmierung 6 13.05.2006 09:49
Probleme mit Variable in SQL Anweisung Doggi Datenbanken 10 15.12.2005 14:04


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:05 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44