LEFT JOIN Abfrage

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

  • LEFT JOIN Abfrage

    ... zu später stunde
    folgendes problem: ich habe eine tabelle 'katalog_buch', in dieser stehen u.a die namen der autoren und ihre autor_id. in einer zweiten tabelle 'katalog_buch' steht u.a auch die autor_id aus der ersten tabelle.
    soweit sogut,... auf einer seite der anwendung frage ich die tabelle 'katalog_buch' ab, aber nun möchte ich bei der ausgabe in html natürlich nicht die autor_id stehen haben, sondern den namen des dazugehörigen autors.
    z.Zt. sieht die ausgabe so aus:

    1 Buchtitel1 28
    2 Buchtitel2 12
    3 Buchtitel3 45

    ich hätte es aber gerne so:

    1 Buchtitel1 Max Müller
    2 Buchtitel2 Dieter Maier
    3 Buchtitel3 Karl Koch

    ich denke da könnte ein LEFT JOIN abhilfe schaffen, nur leider haben alle experimente nicht das gesuchte ergebnis gebracht.
    vieleicht weis einer rat

    mfg, crisdoe

    PHP-Code:
        // stark vereinfachte und gekürzte version
         
        // db zeugs
        
    @include('include/connect.inc.php');

        
    // variable setzten (hier zu testzwecken)
        
    $title "";    
        
        
    // query
        
    $sql mysql_query("SELECT * FROM katalog_buch AS T1
                                     LEFT OUTER JOIN katalog_autor AS T2  
                                     ON T2.autor_id = T1.autor_1
                                     WHERE T1.titel 
                                     LIKE '"
    .$title."%' 
                                     ORDER BY titel ASC 
                                    "
    ) or die (mysql_error()); 
        
    $result mysql_num_rows($sql) or die (mysql_error());
        
        
    // ergebnisse auslesen
        
    while($row mysql_fetch_array($sql)) {
        
    $buch_id $row['buch_id'];
        
    $titel =  $row['titel'];
        
    $autor_1 =  $row['autor_1'];
        
        
    /// ausgabe
        
    echo "<strong>".$buch_id."</strong>&nbsp;".$titel."&nbsp;<strong>".$autor_1."</strong><br>";
        } 

  • #2
    Poste mal bitte die Tabellenstruktur der zwei Tabellen die du hast...

    PHP-Code:
    SELECT FROM katalog_buch AS T1
    LEFT OUTER JOIN katalog_autor 
    AS T2  
    USING
    (Autor)
    WHERE T1.titel 
    LIKE 
    '".$title."%' 
    ORDER BY titel ASC 
    ") 
    Mehr zu Using siehe hier
    mfg
    Günni


    Praxis: Jeder kann´s, aber keiner weiß wie´s geht...
    Theorie: Jeder weiß wie´s geht, aber keiner kann´s ...
    Microsoft vereint Praxis und Theorie: Nix geht und keiner weiß warum
    City-Tiger - Online durch die Straßen tigern...

    Kommentar


    • #3
      ... hier die tabellenstruktur:
      katalog_autor enthält u.a. name und autor_id
      katalog_buch enthält die autor_id (autor_1) nicht aber den namen den ich für die ausgabe benötige!

      danke und gruss,
      crisdoe

      PHP-Code:
      CREATE TABLE katalog_autor (
        
      autor_id int(10NOT NULL auto_increment,
        
      nachname varchar(255),
        
      vorname varchar(255),
        
      name varchar(255)
      TYPE=MyISAM;


      CREATE TABLE katalog_buch (
        
      buch_id int(11NOT NULL auto_increment,
        
      titel varchar(255),
        
      untertitel varchar(255),
        
      reihe varchar(255),
        
      autor_1 int(10)
      TYPE=MyISAM
      Zuletzt geändert von crisdoe; 17.05.2003, 12:06.

      Kommentar


      • #4
        @crisdoe
        deine abfrage scheint auf den ersten blick schon ok zu sein.

        aber du kannst mal folgendes testen.

        nenne in beiden tabellen die spalte für die verknüpfung (autor_id) gleich. also das autor_1 umbennenen.

        und dann teste mal diese query:

        Code:
        SELECT  B.buch_id,
                B.titel,
                B.untertitel,
                B.reihe
        FROM    katalog_buch B
                    LEFT OUTER JOIN katalog_autor A USING(autor_id)
        WHERE   A.nachname = 'bohlen'
        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


        • #5
          ... ändert leider nichts in der ausgabe, weder in php, noch unter sqlwin-oberfläche, es werden immer nur die autor_id ausgespuckt, der name wird nicht angezeigt(1 anstelle von 'Max Müller')
          USING sollte ich glaube ich auch nicht verwenden, da es mehrere autoren (autor_1, autor_2, autor_3) und dementsprechende id's in der Tabelle 'katalog_buch' gibt...

          ist es (bestimmt!) überhaupt möglich in einer abfrage das gewünschte resultat zu erreichen?

          folgende db struktur benutze ich:
          PHP-Code:
          CREATE TABLE katalog_autor (
            
          autor_id int(10),
            
          name varchar(255)
          TYPE=MyISAM;


          CREATE TABLE katalog_buch (
            
          buch_id int(11),
            
          titel varchar(255),
            
          autor_1 int(10)
          TYPE=MyISAM
          und als ein eine der vielen möglichkeiten folgende abfrage:
          PHP-Code:
          SELECT FROM katalog_buch AS T1
                          LEFT OUTER JOIN katalog_autor 
          AS T2  
                          ON T2
          .autor_id T1.autor_1 
          z.Zt. sieht die ausgabe so aus:

          1 Buchtitel1 28
          2 Buchtitel2 12
          3 Buchtitel3 45

          ich hätte es aber gerne so:

          1 Buchtitel1 Max Müller
          2 Buchtitel2 Dieter Maier
          3 Buchtitel3 Karl Koch

          :me am verzweifeln,
          danke und gruss,
          crisdoe

          Kommentar


          • #6
            du hast ja auch eine total bescheuerte tabellenstruktur...

            so gehts.
            Code:
            SELECT  B.buch_id,
                    B.titel,
                    A.name
            FROM    katalog_buch B
                        LEFT OUTER JOIN katalog_autor A USING(autor_id)
            und die tabellen KORREKT !!!

            Code:
            #
            # Table structure for table `katalog_autor`
            #
            
            DROP TABLE IF EXISTS katalog_autor;
            CREATE TABLE katalog_autor (
              autor_id int(10) NOT NULL auto_increment,
              name varchar(30) NOT NULL default '',
              PRIMARY KEY  (autor_id)
            ) TYPE=MyISAM;
            
            #
            # Dumping data for table `katalog_autor`
            #
            
            INSERT INTO katalog_autor (autor_id, name) VALUES (1, 'autor 1');
            INSERT INTO katalog_autor (autor_id, name) VALUES (2, 'autor 2');
            INSERT INTO katalog_autor (autor_id, name) VALUES (3, 'autor 3');
            # --------------------------------------------------------
            
            #
            # Table structure for table `katalog_buch`
            #
            
            DROP TABLE IF EXISTS katalog_buch;
            CREATE TABLE katalog_buch (
              buch_id int(10) NOT NULL auto_increment,
              titel varchar(50) NOT NULL default '',
              autor_id int(10) NOT NULL default '0',
              PRIMARY KEY  (buch_id)
            ) TYPE=MyISAM;
            
            #
            # Dumping data for table `katalog_buch`
            #
            
            INSERT INTO katalog_buch (buch_id, titel, autor_id) VALUES (1, 'erstes buch', 1);
            INSERT INTO katalog_buch (buch_id, titel, autor_id) VALUES (2, 'zweites buch', 1);
            INSERT INTO katalog_buch (buch_id, titel, autor_id) VALUES (3, 'drittes buch', 1);
            INSERT INTO katalog_buch (buch_id, titel, autor_id) VALUES (4, 'viertes buch', 2);
            INSERT INTO katalog_buch (buch_id, titel, autor_id) VALUES (5, 'fünftes buch', 3);
            INSERT INTO katalog_buch (buch_id, titel, autor_id) VALUES (6, 'sechtes buch', 3);
            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


            • #7
              dankeschön das hilft mir schon mal weiter, die ausgabe klappt nun wie gewünscht.

              dennoch habe ich noch ein kleines problem, ein Buch kann mehrere autoren haben, deshalb habe ich mehrere felder (autor_1,autor_2,autor_3) in der tabelle 'katalog_buch' definiert die jeweils eine autor_id aus der tabelle 'katalog_autor' bekommen können.

              USING scheidet denke ich dadurch aus! wie gehe ich am besten vor?

              thx für deine mühe

              Kommentar


              • #8
                auch mehrere autoren funktionieren. man braucht nur noch eine dritte tabelle. und in der ersten tabelle (buch) braucht man die spalte autor_id auch nicht mehr.

                mit dieser query gehts.
                Code:
                SELECT  B.buch_id,
                        B.titel,
                        A.name
                FROM    katalog_buch B
                            LEFT OUTER JOIN katalog_buch_autor BA USING(buch_id)
                                LEFT OUTER JOIN katalog_autor A USING(autor_id)
                und die tabellen dazu.

                Code:
                #
                # Table structure for table `katalog_autor`
                #
                
                DROP TABLE IF EXISTS katalog_autor;
                CREATE TABLE katalog_autor (
                  autor_id int(10) NOT NULL auto_increment,
                  name varchar(30) NOT NULL default '',
                  PRIMARY KEY  (autor_id)
                ) TYPE=MyISAM;
                
                #
                # Dumping data for table `katalog_autor`
                #
                
                INSERT INTO katalog_autor (autor_id, name) VALUES (1, 'autor 1');
                INSERT INTO katalog_autor (autor_id, name) VALUES (2, 'autor 2');
                INSERT INTO katalog_autor (autor_id, name) VALUES (3, 'autor 3');
                # --------------------------------------------------------
                
                #
                # Table structure for table `katalog_buch`
                #
                
                DROP TABLE IF EXISTS katalog_buch;
                CREATE TABLE katalog_buch (
                  buch_id int(10) NOT NULL auto_increment,
                  titel varchar(50) NOT NULL default '',
                  PRIMARY KEY  (buch_id)
                ) TYPE=MyISAM;
                
                #
                # Dumping data for table `katalog_buch`
                #
                
                INSERT INTO katalog_buch (buch_id, titel) VALUES (1, 'erstes buch');
                INSERT INTO katalog_buch (buch_id, titel) VALUES (2, 'zweites buch');
                INSERT INTO katalog_buch (buch_id, titel) VALUES (3, 'drittes buch');
                INSERT INTO katalog_buch (buch_id, titel) VALUES (4, 'viertes buch');
                INSERT INTO katalog_buch (buch_id, titel) VALUES (5, 'fünftes buch');
                INSERT INTO katalog_buch (buch_id, titel) VALUES (6, 'sechtes buch');
                # --------------------------------------------------------
                
                #
                # Table structure for table `katalog_buch_autor`
                #
                
                DROP TABLE IF EXISTS katalog_buch_autor;
                CREATE TABLE katalog_buch_autor (
                  buch_id int(10) NOT NULL default '0',
                  autor_id int(10) NOT NULL default '0',
                  UNIQUE KEY buch_autor (buch_id,autor_id),
                  KEY buch (buch_id),
                  KEY autor (autor_id)
                ) TYPE=MyISAM;
                
                #
                # Dumping data for table `katalog_buch_autor`
                #
                
                INSERT INTO katalog_buch_autor (buch_id, autor_id) VALUES (1, 1);
                INSERT INTO katalog_buch_autor (buch_id, autor_id) VALUES (2, 1);
                INSERT INTO katalog_buch_autor (buch_id, autor_id) VALUES (2, 3);
                INSERT INTO katalog_buch_autor (buch_id, autor_id) VALUES (3, 2);
                INSERT INTO katalog_buch_autor (buch_id, autor_id) VALUES (4, 2);
                INSERT INTO katalog_buch_autor (buch_id, autor_id) VALUES (4, 3);
                INSERT INTO katalog_buch_autor (buch_id, autor_id) VALUES (5, 1);
                INSERT INTO katalog_buch_autor (buch_id, autor_id) VALUES (5, 2);
                INSERT INTO katalog_buch_autor (buch_id, autor_id) VALUES (5, 3);
                INSERT INTO katalog_buch_autor (buch_id, autor_id) VALUES (6, 2);
                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


                • #9

                  grosses dankeschön! eine frage noch, hat ein LEFT JOIN irgendwelche Nachteile bezüglich update/insert verhalten (kann man JOIN auch dort benutzen oder sind einzelne querys nötig), gibt es nachteile in der geschwindigkeit o.ä....

                  gruss und danke

                  Kommentar


                  • #10
                    JOINS sind schnell. und so wir ich dir die tabs gepostet hab, das beste ...

                    UPDATE und INSERT musst du natürlich in jeder tabelle separat machen.
                    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


                    • #11
                      O.K. ...dann mach ich mich jetzt dran die db umzustricken

                      thx,
                      gruss, crisdoe

                      Kommentar


                      • #12
                        ... da bin ich nochma

                        klappt soweit ganz gut, nun folgendes problem: wie gebe ich die daten in einer reihe aus, also z.b:

                        5 fünftes buch autor 1 / autor 2 / autor 3

                        derzeit siehts noch so aus:

                        5 fünftes buch autor 1
                        5 fünftes buch autor 2
                        5 fünftes buch autor 3


                        PHP-Code:
                        /// stark vereinfachte und gekürzte version
                             
                        /// Datenbank Server (Host)
                            
                        $server "localhost";
                        /// Benutzer (admin)
                            
                        $benutzer "";
                        /// Passwort (admin)
                            
                        $kennwort "";
                        /// Datenbank (MySQL)
                            
                        $datenbank "join";
                        /// Verbindung zum MySQL Server
                            
                        $verbindung mysql_connect($server,$benutzer,$kennwort) or die (mysql_error()); 
                        /// Auswählen der Datenbank
                            
                        mysql_select_db($datenbank,$verbindung) or die (mysql_error()); 

                            
                        // variable setzten (hier zu testzwecken)
                            
                        $buch_id "5";    
                            
                            
                        // query
                            
                        $sql mysql_query("SELECT *
                                                  FROM katalog_buch B
                                       LEFT OUTER JOIN katalog_id C USING(buch_id)
                                       LEFT OUTER JOIN katalog_autor A USING(autor_id)
                                                 WHERE B.buch_id = '"
                        .$buch_id."'
                                                        "
                        ) or die (mysql_error()); 
                            
                        $result mysql_num_rows($sql) or die (mysql_error());
                            
                            
                        // ergebnisse auslesen
                            
                        while($row mysql_fetch_array($sql)) {
                            
                        $buch_id $row['buch_id'];
                            
                        $titel =  $row['titel'];
                            
                        $name =  $row['name'];
                            
                            
                        /// ausgabe
                            
                        echo "<strong>".$buch_id."</strong>&nbsp;".$titel."&nbsp;<strong>".$name."</strong><br>";
                            } 
                        für weiteren support wär ich echt dankbar
                        gruss, crisdoe

                        Kommentar


                        • #13
                          PHP-Code:
                          // ergebnisse auslesen
                          $buchid='fubar';
                          while(
                          $row mysql_fetch_array($sql)) 
                          {
                              
                          $buch_id $row['buch_id'];
                              
                          $titel =  $row['titel'];
                              
                          $name =  $row['name'];
                              
                          /// ausgabe
                              
                          if ($buchid!=$buch_id)
                              {
                                  if (
                          $buchid!='fubar')
                                      echo 
                          "<br  />";
                                  echo 
                          "<strong>".$buch_id."</strong>&nbsp;".$titel."&nbsp;";
                                  
                          $buchid=$buch_id;
                              }
                              echo 
                          "<strong>"$name."</strong>";

                          Zuletzt geändert von mrhappiness; 17.05.2003, 21:31.
                          Ich denke, also bin ich. - Einige sind trotzdem...

                          Kommentar


                          • #14
                            code sieht sehr tricky aus...

                            funktioniert einwandfrei, erzeugt folgendes:

                            5 fünftes buch autor 1 autor 2 autor 3

                            frage (hoffentlich die letzte,...):
                            ich möchte zwischen den autoren, falls es mehrere sind eine trenner, z.b.: /

                            5 fünftes buch autor 1 / autor 2 / autor 3
                            oder
                            4 viertes buch autor 1 / autor 2
                            oder
                            3 drittes buch autor 1

                            ich denke soetwas ist mit count() u.a möglich, finde jedoch im script keinen ansatz...

                            mein 100'er post
                            Zuletzt geändert von crisdoe; 17.05.2003, 21:52.

                            Kommentar


                            • #15
                              PHP-Code:
                              if ($buchid!=$buch_id)
                              {
                                  if (
                              $buchid!='fubar')
                                      echo 
                              "<br  />";
                                  echo 
                              "<strong>".$buch_id."</strong>&nbsp;".$titel."&nbsp;<strong>"$name."</strong>";
                                  
                              $buchid=$buch_id;
                              }
                              else
                                  echo 
                              "<strong>&nbsp;/&nsbp;".$name."</strong>"
                              so?
                              Ich denke, also bin ich. - Einige sind trotzdem...

                              Kommentar

                              Lädt...
                              X