[SQL allgemein] Abfrageproblem

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

  • #16
    in deiner tabelle menu_has_menu sind zu wenig einträge (und verkehrt rum)

    so sollte es gehen
    Code:
    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)
    du musst die komplette hierarchie für jeden punkt speichern
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #17
      oh happy, das wird ne längere geschichte

      also erstmal: ich krieg jetzt in der while-schleife die erwartete ausgabe
      (das warum klären wir später)

      die funktion liefert aber nach wie vor nix => ist also leer
      PHP-Code:
      $result mysql_query($sql,$conn) or die(mysql_error());
      mysql_num_rows($result);
      $rows mysql_fetch_array($result);


      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); 
      definier ich $rows/$result falsch?

      PS: dir ist schon klar, dass ich bisher noch nicht so genau weiss, was wir hier tun
      Kissolino.com

      Kommentar


      • #18
        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.
        Kissolino.com

        Kommentar


        • #19
          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

          Kommentar


          • #20
            es steht doch sogar mit beispiel-datensätzen genau über deinem post
            Kissolino.com

            Kommentar


            • #21
              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...)

              Kommentar


              • #22
                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.
                Kissolino.com

                Kommentar


                • #23
                  @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.
                  TBT

                  Die zwei wichtigsten Regeln für eine berufliche Karriere:
                  1. Verrate niemals alles was du weißt!


                  PHP 2 AllPatrizier II Browsergame

                  Kommentar


                  • #24
                    OffTopic:
                    @TBT
                    ist raus ^^ ... in meinen scripten darf ichs aber behalten
                    Kissolino.com

                    Kommentar


                    • #25
                      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?

                      Kommentar


                      • #26
                        alle menüpunkte sind grundsätzlich der 0 untergeordnet. daher muss das auch immer mit rein.
                        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                        Kommentar


                        • #27
                          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.

                          Kommentar


                          • #28
                            die (ein)sortierung passiert noch nicht in der sql-query sondern später mit php.
                            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                            Kommentar


                            • #29
                              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

                              Kommentar


                              • #30
                                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.

                                Kommentar

                                Lädt...
                                X