php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 03.09.2007, 14:45  
Erfahrener Benutzer
 
Registriert seit: 27.08.2003
Beiträge: 449
PHP-Kenntnisse:
Fortgeschritten
GSJLink
Standard Nested Sets Query

Hallo,

ich bin gerade dabei wieder mal ein bisschen mit Nested Sets rumzuprobieren. Ich bin jetzt aber leider auf ein Hinterniss gestoßen.

Ich möchte jetzt die Struktur überhalb eines Blattes (id = x) ausgeben. Dies soll aber so ähnlich aussehen wie im Windows Explorer. Das heißt es soll immer nur die Ebene angezeigt werden, in dem das Blatt x selber ist (allerdings nur die, die unter dem Parent von x ist). Das selbe gilt dann auch für alle übergeordneten Blätter/Knoten von x.

Hier noch ein kleines Screenshot zur Verdeutlichung:



Der Ordner Desktop soll hier dann das Blatt x darstellen. Die Unterblätter des Blattes x interessieren mich dabei allerdings nicht.

Kann man das alles in einen Query reinpacken oder muss man den ganzen Baum auslesen und dann entsprechend auswerten (also mit if Schleifen)?


mfg
Link
GSJLink ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 03.09.2007, 16:00  
Erfahrener Benutzer
 
Registriert seit: 21.07.2005
Beiträge: 209
pepe24
Standard

Hallo,

ganz auslesen brauchst du den Baum ja nicht... nur die Punkte die entweder dasselbe Submenu-Level haben (Ordner im gleich Verzeichnis) oder wenn ein Knoten die Parent-ID des angeforderten Unterknotens hat.
Dann kannst du dich ja levelweise beim auslesen hocharbeiten, bis du bei lvl 0 angekommen bist. Nicht-offene Ordner musst du ja nicht komplett auslesen, weil ihre Untermenüs ja nicht angezeigt werden.

Für die Darstellung musst du allerdings feststellen, ob ein Punkt noch unterpunkte hat oder nicht. (Pfeile)

Denke also schon, dass man das ganze in einer Query lösen kann.

Gruß
pepe24 ist offline   Mit Zitat antworten
Alt 03.09.2007, 16:47  
Erfahrener Benutzer
 
Registriert seit: 27.08.2003
Beiträge: 449
PHP-Kenntnisse:
Fortgeschritten
GSJLink
Standard

Das Nested Sets Model sieht keine Parent ID Spalte vor. Das Problem wo ich dran scheiter ist ja, das mit sagen wir in dem Beispielbild die Blätter im Level 2 auch z.B. die Unterordner von "All Users" & "Mark" etc. einschließen und nicht nur die vom Ordner "Default Users".

mfg
Link
__________________
"Ein Script ist nur dann gut, wenn es unabhängig von der verwendeten Plattform funktioniert"
GSJLink ist offline   Mit Zitat antworten
Alt 03.09.2007, 18:45  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Wird schwierig, Nested Sets sind eigentlich für die umgekehrte Selektion konzipiert worden. Heißt: Hole mit einem Schlag alle Kinder. Hole mit einem Schlag alle Eltern erfordert ein neues Konzept.
Zergling-new ist offline   Mit Zitat antworten
Alt 03.09.2007, 18:47  
Erfahrener Benutzer
 
Registriert seit: 27.08.2003
Beiträge: 449
PHP-Kenntnisse:
Fortgeschritten
GSJLink
Standard

Irgendwie muss man das doch hinbekommen xD Mein Ansatz war ja nach level zu gehen und das dann einzugrenzen, dass die Werte left und right von x ja zwischen left und right von dem darüberliegenden sein müssen. Bzw nur die left Werte reichen ja.

mfg
Link
__________________
"Ein Script ist nur dann gut, wenn es unabhängig von der verwendeten Plattform funktioniert"
GSJLink ist offline   Mit Zitat antworten
Alt 08.09.2007, 09:52  
Clan
Gast
 
Beiträge: n/a
Standard

So in der art und weise müsste es gehen wenn ich mich nicht irre..

PHP-Code:
$sql "SELECT  a.lft , a.rgt ,a.node_id  FROM nestedset AS a 
    INNER JOIN nestedset AS b ON (a.lft <= b.lft AND a.rgt >= b.rgt) 
    WHERE b.node_id = "
.$node_id." ORDER BY a.lft";


$tmp        = array();    
.
.
$res = ...
while(
$dat mysql_fetch_object($res))
 {
                        
$level++;


              
$tmp []= " (node1.lft > ".$dat->lft." AND node1.rgt < ".$dat->rgt." and level=".$level.") ";
}

$tmp          implode(" or "$tmp );
$sql          "SELECT node1.rgt,node1.lft,
                                    node1.beschreibung, 
                                    IF( node1.node_id = node1.root_id, round( (node1.rgt -2) /2, 0 ) , round( ( (  node1.rgt - node1.lft -1 ) /2 ) , 0 ) ) AS children, COUNT( * ) AS level , node1.node_id
                                FROM 
                                        nestedset AS node1, nestedset AS node2
                                WHERE 
                                    node1.root_id =1
                                    AND node2.root_id =1
                                    AND node1.lft
                                BETWEEN node2.lft AND node2.rgt
                                GROUP BY node1.LFT
                                HAVING level <= 2  and "
.$tmp." ORDER BY node1.lft";

$res = ...
  while(
$datmysql_fetch_object($res)){
  
//der Baum  

  

  Mit Zitat antworten
Alt 08.09.2007, 10:03  
Erfahrener Benutzer
 
Registriert seit: 27.08.2003
Beiträge: 449
PHP-Kenntnisse:
Fortgeschritten
GSJLink
Standard

Im Prinzip hab ich das jetzt auch so gemacht, nur mit einem Query und eine Auswertung hinterher. Ich habe den Weg deshalb eingeschlagen, weil man dann leichter eine mit JS klappbare Baumstruktur bauen kann.

Trotzdem danke


mfg
Link
__________________
"Ein Script ist nur dann gut, wenn es unabhängig von der verwendeten Plattform funktioniert"
GSJLink ist offline   Mit Zitat antworten
Alt 08.09.2007, 10:09  
Clan
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von GSJLink
Im Prinzip hab ich das jetzt auch so gemacht, nur mit einem Query und eine Auswertung hinterher. Ich habe den Weg deshalb eingeschlagen, weil man dann leichter eine mit JS klappbare Baumstruktur bauen kann.

Trotzdem danke


mfg
Link

Zeig mal deine Lösung.... *g*
mich würd doch mal interessieren wie du das denn jetzt gelöst hast.
  Mit Zitat antworten
Alt 08.09.2007, 10:18  
Erfahrener Benutzer
 
Registriert seit: 27.08.2003
Beiträge: 449
PHP-Kenntnisse:
Fortgeschritten
GSJLink
Standard

Ok, das ganze sieht etwa so aus:

PHP-Code:

$folder 
$_GET['folder']; /* aktiver Ordner */
                
    
$sql "SELECT * FROM folder WHERE `id` = '$folder' LIMIT 1;"/* Hiermit will ich die Left & Right Werte des aktuellen Ordners auslesen */
    
$ergebnis mysql_query($sql$verbindung);
    
$folder_data mysql_fetch_object($ergebnis);

    
$counter2 1;
    
$counter 1;
    
$next_div = array();
    
$sql "SELECT n.id, n.name, n.left, n.right,
                         COUNT(*)-1 AS level,
                         ROUND((n.right - n.left - 1) / 2) AS offspring
                    FROM folder AS n,
                         folder AS p
                   WHERE n.left BETWEEN p.left AND p.right
                GROUP BY n.left
                ORDER BY n.left;"
/* Kompletter Baum mit level und Nachfahren (offspring) */
    
$ergebnis mysql_query($sql$verbindung);
    while(
$row mysql_fetch_object($ergebnis)) {    
        if(
$row->level == "1") { /* Level 1 soll immer offen sein! */                
            
if($row->offspring 0) {
                if(
$folder_data->left $row->left && $folder_data->left $row->right) {
                    
$img 'folder_minus.gif';
                    
$div '<div id="group_'.$counter.'" style="display:block;">';    
                }else{
                    
$img 'folder_plus.gif';
                    
$div '<div id="group_'.$counter.'" style="display:none;">';    
                }
                echo 
'<a href="javascript:switch_folder(\''.$counter.'\');" class="folder_switch" style="margin-left:18px;">
                [img]'
.$url.'/filebrowser/images/'.$img.'[/img]
                </a>
                <a href="javascript:open_folder(\''
.$row->id.'\');" class="folder_a" style="margin-left:2px;">
                <img id="folderimg_'
.$row->id.'" src="'.$url.'/filebrowser/images/folder.gif" /> '.$row->name.'
                </a>
'
;
                
$next_div[$row->level] = $counter2 $row->offspring;
                echo 
$div;                                
                
$counter++;
            }else{
                echo 
'<a href="javascript:open_folder(\''.$row->id.'\');" class="folder_a" style="margin-left:29px;">
                <img id="folderimg_'
.$row->id.'" src="'.$url.'/filebrowser/images/folder.gif" /> '.$row->name.'
                </a>
'
;
            }                
        }elseif(
$row->level "1") { /* alle restlichen Ebenenen */
            
if($row->offspring 0) {
                if(
$folder_data->left $row->left && $folder_data->left $row->right) {
                    
$img 'folder_minus.gif';
                    
$div '<div id="group_'.$counter.'" style="display:block;">';    
                }else{
                    
$img 'folder_plus.gif';
                    
$div '<div id="group_'.$counter.'" style="display:none;">';    
                }
                
$margin = (($row->level 1) * 16) + 18;
                echo 
'<a href="javascript:switch_folder(\''.$counter.'\');" class="folder_switch" style="margin-left:'.$margin.'px; float:left;">
                [img]'
.$url.'/filebrowser/images/'.$img.'[/img]
                </a>
                <a href="javascript:open_folder(\''
.$row->id.'\');" class="folder_a" style="margin-left:2px;">
                <img id="folderimg_'
.$row->id.'" src="'.$url.'/filebrowser/images/folder.gif" /> '.$row->name.'
                </a>
'
;
                echo 
$div;
                
$next_div[$row->level] = $counter2 $row->offspring;
                
$counter++;
            }else{
                
$margin = (($row->level 1) * 16) + 29;
                echo 
'<a href="javascript:open_folder(\''.$row->id.'\');" class="folder_a" style="margin-left:'.$margin.'px;">
                <img id="folderimg_'
.$row->id.'" src="'.$url.'/filebrowser/images/folder.gif" /> '.$row->name.'</a>
'
;
            }
        }else{ 
/* Root Ordner */
            
echo '<a href="javascript:switch_folder(\''.$counter.'\');" class="folder_switch" style="margin-left:2px; float:left;">
            [img]'
.$url.'/filebrowser/images/folder_minus.gif[/img]
            </a>
            <a href="javascript:open_folder(\''
.$row->id.'\');" class="folder_a" style="margin-left:2px;">
            <img id="folderimg_'
.$row->id.'" src="'.$url.'/filebrowser/images/root.gif" /> '.$row->name.'/
            </a>
'
;
            echo 
'<div id="group_'.$counter.'" style="display:block;">';
            
$counter++;
        }    
        foreach(
$next_div as $div) {
            if(
$div == $counter2) {
                echo 
'</div>';
            }
        }
        
$counter2++;
    }
    echo 
'</div>'
Ich denke mal, dass es klar ist, was die JS Funktionen machen. $margin ist übrigends für die Einrückung zuständig

mfg
Link
GSJLink ist offline   Mit Zitat antworten
Alt 08.09.2007, 10:26  
Clan
Gast
 
Beiträge: n/a
Standard

ahh, du holst dir also alle daten.... *g*
ja, das ist auch ein weg.
  Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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 an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Nested Sets und viele Fragen... BartTheDevil89 Datenbanken 7 13.08.2008 10:18
Nested Sets oder Rekursion? litterauspirna PHP Tipps 2008 8 06.06.2008 16:57
Nested Sets in ein Mehrdimensionales Array Simon9990 PHP-Fortgeschrittene 2 29.10.2007 17:38
NS Query Problem GSJLink Datenbanken 0 07.09.2007 18:04
Variablen in Query automatisch escapen Maho88 PHP Tipps 2007 10 31.07.2007 08:42
Nested Sets und Silbings nightfreak Datenbanken 10 06.01.2006 13:58
Nested Sets History Sirke PHP-Fortgeschrittene 1 21.10.2005 08:50
erklärung gesucht: nested set query! Sirke Datenbanken 0 19.09.2005 17:24
Alternative zu Nested Sets fantast Datenbanken 1 16.08.2005 01:14
hilfe nested sets zapate Datenbanken 6 02.08.2005 02:58
Nested Sets mit Berechtigungen? daniel987 Datenbanken 3 07.06.2005 22:18
[Erledigt] Frage zu nested sets... PHP-Fortgeschrittene 2 04.03.2005 09:57
NESTED SETS dieses Thema sollte abgehakt werden PHP Tipps 2004 0 12.10.2004 18:18
select query durch if anweisungen splitten Datenbanken 6 06.09.2004 13:46
[Erledigt] Query läuft nicht Datenbanken 6 13.08.2004 21:13

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
nested query, nested set sql level, nested sets sql level auslesen, http://www.php.de/datenbanken/44706-nested-sets-query.html, nested sets class, php nested set parent gleiche ebene ausgeben, nested set query, nested set explorer, nested sets root_id as offspring,, nested sets darstellen, was ist ein nested query, nested sets eltern, ordnerstruktur als nested set einlesen, php nested sets ausgeben, verschachtelte darstellung php, nested sets php auswerten, nested sets blätter ebene, nested sets blätter, php verschachtelte links, nested sets query

Alle Zeitangaben in WEZ +1. Es ist jetzt 03:16 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.