[SQL allgemein] Abfrageproblem

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • DomGer
    antwortet
    Wie BreadCrumb erzeugen?

    Hallo,

    Wie schaffe ich es mit dem genialen Code, den Wurzel auf Seite 2 postet eine BREADCRUMB- Navi zu erstellen?

    Die normale Navi funktioniert ja. Für die BreadCrumb bräuchte man ja "nur" diejenigen Einträge, die an Schlüsselpositionen sind. Bruder/Schwester Einträge braucht man hierzu nicht. Aber: WIe mache ich das?

    Also, um beim Beispiel von Wurzels Code zu bleiben:

    Normale Navi:
    home
    2.punkt
    3.punkt
    · 1.sub
    · 2.sub
    · 3.sub
    · · 1.subsub
    · · 2.subsub (<-- Dies soll der ausgewählte Eintrag sein)

    BreadCrumb soll nun so aussehen:
    >> 3.punkt >> 3.sub >> 2.subsub

    Wie mache ich das?? Bestimmt muss man die sql-Abfrage ändern?!
    Hier nochmal der Code von Wurzel (normale Navi)

    PHP-Code:
    $menu 120
    $sql='SELECT m2.menu_id, m2.sort, m2.parent_id, m2.name
        FROM  n_menu m
        LEFT JOIN menu_has_menu mm 
            ON  ( m.menu_id = mm.child_id ) 
        LEFT JOIN n_menu m2
            ON ( mm.menu_id = m2.parent_id )
        WHERE m.menu_id = '
    .$menu.' or m.parent_id = '.$menu.
        GROUP BY m2.menu_id, m2.parent_id, m2.sort 
        ORDER BY m2.parent_id,  m2.sort'
    ;

    $go mysql_query($sql,$conn) or die(mysql_error());
    $rows mysql_num_rows($go);

    while(
    $set mysql_fetch_array($go))
    {
        
    $result[]=$set;
    }

    function &
    build_menu(&$result,&$rows,$parent=0,$level=0){
        
    $output '';
        for(
    $i=0;$i<$rows;++$i){
            if(
    $result[$i]['parent_id']==$parent){
                
    $output .= str_repeat(':',$level).' <a href="index.php?menu='.$result[$i]['menu_id'].'">'.$result[$i]['name'].'</a><br>';
                
    $output .= build_menu($result,$rows,$result[$i]['menu_id'],$level+1);
            }
        }
        return 
    $output;
    }
    echo 
    $menu_var build_menu($result,$rows); 

    Habt Ihr villeicht eine Idee, wie ich nun hieraus eine BreadCrumb-navi erzeugen kann?

    -DomGer.

    Einen Kommentar schreiben:


  • lx-club
    antwortet
    Original geschrieben von lx-club
    jetzt erhalte ich bei der abfrage immer ne leere tabellenzeile zum anfang. woran kann das liegen?

    EDIT:
    das stand bereits in deinem letzten posting.
    bitte übe dich in ein wenig mehr geduld, anstatt hier durch erneutes posten zu drängeln, wenn dir die antworten nicht schnell genug kommen!
    wahsaga

    ich schreib im ersten posting ich bekomm ne leerzeile und in meinem letzen posting ging es darum das ich IMMER ne leerzeile bekomm bei jeder abfrage

    Einen Kommentar schreiben:


  • lx-club
    antwortet
    jetzt erhalte ich bei der abfrage immer ne leere tabellenzeile zum anfang. woran kann das liegen?

    EDIT:
    das stand bereits in deinem letzten posting.
    bitte übe dich in ein wenig mehr geduld, anstatt hier durch erneutes posten zu drängeln, wenn dir die antworten nicht schnell genug kommen!
    wahsaga

    Zuletzt geändert von wahsaga; 03.01.2004, 16:45.

    Einen Kommentar schreiben:


  • lx-club
    antwortet
    achso in php.
    Nur wenn ich in die abfrage noch folgendes nach dem ORDER BY hinzufüge:

    m2.menu_id

    klappt die sortierung fast auch allein in sql, nur wenn ich hier:

    WHERE m.menu_id = '143' or m.parent_id = '143'

    benutze, funzt es auch, nur ich bekomm am anfang ne leere tabellenzeile. ansonsten würde die sortierung wunderbar schon mit sql klappen

    Einen Kommentar schreiben:


  • Abraxax
    antwortet
    die (ein)sortierung passiert noch nicht in der sql-query sondern später mit php.

    Einen Kommentar schreiben:


  • lx-club
    antwortet
    gefält mir gut die lösung nachdem ich mit diesem nested set model nicht zu diesem ergebnis gekommen bin.

    aber hab noch nen kleine fehler drin.

    meine tabellen sind mit denen hier im forum gleich hab nur andere werte mal zum testen:
    Code:
    INSERT INTO menu_has_menu VALUES("0", "137");
    INSERT INTO menu_has_menu VALUES("0", "138");
    INSERT INTO menu_has_menu VALUES("0", "139");
    INSERT INTO menu_has_menu VALUES("0", "140");
    INSERT INTO menu_has_menu VALUES("0", "141");
    INSERT INTO menu_has_menu VALUES("0", "142");
    INSERT INTO menu_has_menu VALUES("0", "144");
    INSERT INTO menu_has_menu VALUES("0", "145");
    INSERT INTO menu_has_menu VALUES("0", "146");
    INSERT INTO menu_has_menu VALUES("138", "139");
    INSERT INTO menu_has_menu VALUES("138", "140");
    INSERT INTO menu_has_menu VALUES("138", "141");
    INSERT INTO menu_has_menu VALUES("138", "142");
    INSERT INTO menu_has_menu VALUES("140", "141");
    INSERT INTO menu_has_menu VALUES("140", "142");
    INSERT INTO menu_has_menu VALUES("143", "144");
    INSERT INTO menu_has_menu VALUES("143", "145");
    INSERT INTO menu_has_menu VALUES("143", "146");
    INSERT INTO menu_has_menu VALUES("144", "145");
    
    
    #
    # Dumping data for table 'n_menu'
    #
    
    INSERT INTO n_menu VALUES("137", "0", "Oberpunkt 1", "1");
    INSERT INTO n_menu VALUES("138", "0", "Oberpunkt 2", "2");
    INSERT INTO n_menu VALUES("139", "138", "U1_OP 2", "1");
    INSERT INTO n_menu VALUES("140", "138", "U2_OP 2", "2");
    INSERT INTO n_menu VALUES("141", "140", "U21_OP 2", "1");
    INSERT INTO n_menu VALUES("142", "140", "U22_OP 2", "2");
    INSERT INTO n_menu VALUES("143", "0", "Oberpunkt 3", "3");
    INSERT INTO n_menu VALUES("144", "143", "U1_OP 3", "1");
    INSERT INTO n_menu VALUES("145", "144", "U11_OP 3", "1");
    INSERT INTO n_menu VALUES("146", "143", "U2_OP 3", "2");
    wenn ich dan diese abfrage ausführe:
    Code:
    SELECT m2.menu_id, m2.sort, m2.parent_id, m2.name
        FROM  n_menu m
        LEFT JOIN menu_has_menu mm 
            ON  ( m.menu_id = mm.child_id ) 
        LEFT JOIN n_menu m2
            ON ( mm.menu_id = m2.parent_id )
        WHERE m.menu_id = '140' or m.parent_id = '140' 
        GROUP BY m2.menu_id, m2.parent_id, m2.sort 
        ORDER BY m2.parent_id,  m2.sort
    bekomm ic hfolgende ausgabe:

    menu_id | sort | parent_id | name
    137 1 0 Oberpunkt1
    138 2 0 Oberpunkt2
    143 3 0 Oberpunkt3
    139 1 138 U1_OP 2
    140 2 138 U2_OP 2
    141 1 140 U21_OP 2
    142 2 140 U22_OP 2

    Müsste die reihenfolge nicht anders sein? (nach Oberpunkt 2 die ganzen unterpunkte??) in eurem beispiel hat das ja auch funktioniert.
    was ist bei mir da noch falsch?
    Zuletzt geändert von lx-club; 03.01.2004, 13:51.

    Einen Kommentar schreiben:


  • Abraxax
    antwortet
    alle menüpunkte sind grundsätzlich der 0 untergeordnet. daher muss das auch immer mit rein.

    Einen Kommentar schreiben:


  • lx-club
    antwortet
    was ich noch nicht kapier, warum in der tabelle mit den child_id's in der ersten spalte zum anfang immer 0 steht und dann der meüeintrag. das wird ja für alle menüpunkte gemacht nur wieso?

    Einen Kommentar schreiben:


  • Wurzel
    antwortet
    OffTopic:
    @TBT
    ist raus ^^ ... in meinen scripten darf ichs aber behalten

    Einen Kommentar schreiben:


  • TBT
    antwortet
    @Wurzel: du kannst aus deiner SQL Abfrage das mm2 entfernen,
    das ist bei dir sowieso nicht benutzt. Bei mir gings da dann weiter
    zu den User- und Gruppenrechten.

    Einen Kommentar schreiben:


  • Wurzel
    antwortet
    neee ... die werte waren gerade da ... ich hab zu testzwecken eine
    existierende tabelle modifiziert.

    és ist also schnuppe, wie die ids in der n_menu kommen, wichtig ist, dass diese als wertepaare "menuid : childid" vollständig auftauchen, d.h. jede
    menuid ist sowohl als (mögl.) elternelement definiert => 0 : id als auch bis zu seiner tiefe in der struktur => eltern1 : id, eltern2 : id

    verfolge mal die ids 131 und 135, dann siehst du, worauf es ankommt.

    Einen Kommentar schreiben:


  • lx-club
    antwortet
    ich schlaf wohl noch
    hatte mich falsch ausgedrückt. wollte eigentlich wissen, wie man auf die werte für die erste spalte ijn der tabelee menu kommt. gibts da ein bestimmtes system? (37, 97, 120, 129...)

    Einen Kommentar schreiben:


  • Wurzel
    antwortet
    es steht doch sogar mit beispiel-datensätzen genau über deinem post

    Einen Kommentar schreiben:


  • lx-club
    antwortet
    Original geschrieben von TBT
    und wieso nicht mit zwei Tabellen, welche
    genau alle deine Wünsche erfüllen ?

    Code:
    CREATE TABLE menu (
      menu_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
      parent_id INTEGER UNSIGNED NOT NULL,
      name VARCHAR(255) NOT NULL,
      sort INTEGER UNSIGNED NOT NULL,
      PRIMARY KEY(menu_id)
    );
    
    CREATE TABLE menu_has_menu (
      menu_id INTEGER UNSIGNED NOT NULL,
      child_id INTEGER UNSIGNED NOT NULL,
      PRIMARY KEY(menu_id, child_id)
    );
    könntet ihr mir bitte mal ein beispiel geben, wie ich dann die werte über die 2 tabellen veteile? (nur mal für ein kleines menu). dann steig ich da besser durch

    Einen Kommentar schreiben:


  • Wurzel
    antwortet
    so, langsam kommt licht in die dunkelheit.

    hier nochmal das komplette (berichtigte) script:
    PHP-Code:
    /*
    #
    # Tabellenstruktur für Tabelle `n_menu`
    #

    CREATE TABLE n_menu (
      menu_id int(10) unsigned NOT NULL auto_increment,
      parent_id int(10) unsigned NOT NULL default '0',
      name varchar(255) NOT NULL default '',
      sort int(10) unsigned NOT NULL default '0',
      PRIMARY KEY  (menu_id)
    ) TYPE=MyISAM;

    #
    # Daten für Tabelle `n_menu`
    #

    INSERT INTO n_menu VALUES (37, 0, 'home', 1);
    INSERT INTO n_menu VALUES (97, 0, '2.punkt', 2);
    INSERT INTO n_menu VALUES (120, 0, '3.punkt', 3);
    INSERT INTO n_menu VALUES (129, 120, '1.sub', 1);
    INSERT INTO n_menu VALUES (130, 120, '2.sub', 2);
    INSERT INTO n_menu VALUES (131, 120, '3.sub', 3);
    INSERT INTO n_menu VALUES (132, 131, '1.subsub', 1);
    INSERT INTO n_menu VALUES (135, 131, '2.subsub', 2);


    CREATE TABLE menu_has_menu (
      menu_id int(10) unsigned NOT NULL default '0',
      child_id int(10) unsigned NOT NULL default '0',
      PRIMARY KEY  (menu_id,child_id)
    ) TYPE=MyISAM;

    #
    # Daten für Tabelle `n_menu`
    #

    INSERT INTO menu_has_menu 
    VALUES 
      (0, 37), 
      (0, 97), 
      (0, 120), 
      (0, 129), 
      (0, 130), 
      (0, 131),
      (0, 132),
      (0, 135),
      (120, 129),
      (120, 130),
      (120, 131),
      (120, 132),
      (120, 135),
      (131, 132),
      (131, 135)
    */

    $menu 120
    $sql='SELECT m2.menu_id, m2.sort, m2.parent_id, m2.name
        FROM  n_menu m
        LEFT JOIN menu_has_menu mm 
            ON  ( m.menu_id = mm.child_id ) 
        LEFT JOIN n_menu m2
            ON ( mm.menu_id = m2.parent_id )
        WHERE m.menu_id = '
    .$menu.' or m.parent_id = '.$menu.
        GROUP BY m2.menu_id, m2.parent_id, m2.sort 
        ORDER BY m2.parent_id,  m2.sort'
    ;

    $go mysql_query($sql,$conn) or die(mysql_error());
    $rows mysql_num_rows($go);

    while(
    $set mysql_fetch_array($go))
    {
        
    $result[]=$set;
    }

    function &
    build_menu(&$result,&$rows,$parent=0,$level=0){
        
    $output '';
        for(
    $i=0;$i<$rows;++$i){
            if(
    $result[$i]['parent_id']==$parent){
                
    $output .= str_repeat(':',$level).' <a href="index.php?menu='.$result[$i]['menu_id'].'">'.$result[$i]['name'].'</a><br>';
                
    $output .= build_menu($result,$rows,$result[$i]['menu_id'],$level+1);
            }
        }
        return 
    $output;
    }
    echo 
    $menu_var build_menu($result,$rows); 
    danke an TBT, dass du mich ins schwitzen gebracht hast und an happy,
    dass ich jetzt (fast) verstehe, was hier verbrochen wird
    Zuletzt geändert von Wurzel; 03.01.2004, 11:48.

    Einen Kommentar schreiben:

Lädt...
X