LEFT JOIN Abfrage

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

  • crisdoe
    antwortet

    ich habe jetzt den code aus meinen testdateien in die "anwendung" implementiert, und schon sind sie wieder da, die probleme....

    aus:

    4 viertes buch autor 1 / autor 2

    wird:

    4 viertes buch autor 1
    4 viertes buch / autor 2

    das ganze ist jetzt in tabellen verpackt, und mit einer zusätzlichen funktion fürs zählen der <tr> zellen (layouttechnische gründe html) versehen. (hier gekürzte version)

    PHP-Code:
    <? /// Query
        $sql = mysql_query("SELECT *
                              FROM katalog_buch B
                   LEFT OUTER JOIN katalog_buch_autor C USING(buch_id)
                   LEFT OUTER JOIN katalog_autor A USING(autor_id)
                                    ") or die (mysql_error()); 
        $result = mysql_num_rows($sql) or die (mysql_error());
    ?>
    <table width="500">
    <? $i = 0; $buchid='fubar'; while($row = mysql_fetch_array($sql)) {  $i=$i+1; 
       $buch_id = $row['buch_id']; // aus tabelle katalog_buch
       $titel = $row['titel']; // aus tabelle katalog_buch
       $name = $row['name']; // aus tabelle katalog_autor              
                  ?>
      <tr> 
        <td><a href="update.php?buch_id=<? echo $buch_id; ?>">bearbeiten</a></td>
        <td><a href="delete.php?buch_id=<? echo $buch_id; ?>">loeschen</a></td>
        <td><strong><? echo $titel; ?></strong></td>
        <td> 
          <?
    /// ausgabe
        if ($buchid!=$buch_id)
        {
          if ($buchid!='fubar')
          echo "<strong>".$name."</strong>";
          $buchid=$buch_id;
        }
        else echo "<strong> / ".$name."</strong>"; 
    ?>
        </td>
      </tr>
      <? }     ?>
      <? while($i < 5 ) {  $i=$i+1;    ?>
      <tr> 
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
      </tr>
      <? }    ?>
    </table>
    ...

    Einen Kommentar schreiben:


  • mrhappiness
    antwortet
    immer wieder gern

    evtl. wäre es übrogens angebracht den trennstrich außerhalb der strong-tags zu platzieren, weil ich einfach mal denke, dass du <strong> statt <b> verwendest um die logische bedeutung hervorzuheben oder?

    Einen Kommentar schreiben:


  • crisdoe
    antwortet
    genau so!

    vielen dank euch beiden für eure mühen und zeit!
    es ist mir eine ehre und vorallendingen, eine hilfe!

    gruss und thx,
    crisdoe

    Einen Kommentar schreiben:


  • mrhappiness
    antwortet
    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?

    Einen Kommentar schreiben:


  • crisdoe
    antwortet
    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, 20:52.

    Einen Kommentar schreiben:


  • mrhappiness
    antwortet
    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, 20:31.

    Einen Kommentar schreiben:


  • crisdoe
    antwortet
    ... 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

    Einen Kommentar schreiben:


  • crisdoe
    antwortet
    O.K. ...dann mach ich mich jetzt dran die db umzustricken

    thx,
    gruss, crisdoe

    Einen Kommentar schreiben:


  • Abraxax
    antwortet
    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.

    Einen Kommentar schreiben:


  • crisdoe
    antwortet

    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

    Einen Kommentar schreiben:


  • Abraxax
    antwortet
    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);

    Einen Kommentar schreiben:


  • crisdoe
    antwortet
    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

    Einen Kommentar schreiben:


  • Abraxax
    antwortet
    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);

    Einen Kommentar schreiben:


  • crisdoe
    antwortet
    ... ä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

    Einen Kommentar schreiben:


  • Abraxax
    antwortet
    @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'

    Einen Kommentar schreiben:

Lädt...
X