Iron-Eagle: MySQL - ID-Spalte tb1(FK) mit Werten aus tb2(PK) auflösen

Hallo Programmierfreunde,
ich steh nun den dritten Tag vor einer unüberwindbaren Hürde für mich, daher heute hier der Aufruf *schäm*

MySQL: SELECT pnid,absender,empfaenger,icon,betreff,datum
       FROM messages;
+----+--------+----------+------+---------+---------------------+
|pnid|absender|empfaenger| icon | betreff | datum               |
|----+--------+----------+------+---------+---------------------+
|  1 |      2 |        1 |04.gif|   Test1 | 2008-01-15 06:00:00 |
+----+--------+----------+------+---------+---------------------+
|  2 |      3 |        1 |02.gif|   Test2 | 2008-01-15 07:00:00 |
+----+--------+----------+------+---------+---------------------+

MySQL: SELECT id,name FROM member;
+----+----------+
| id | name     |
+----+----------+
|  1 | Member_A |
+----+----------+
|  2 | Member_B |
+----+----------+
|  3 | Member_C |
+----+----------+

Natürlich haben die ID-Spalten gleiche Datentypen (hier int).

Per Session-Variable ($_SESSION['nickname']) kann ich den Empfänger mit seinem richtigen Namen auflösen.

Bis jetzt hab ich folgendes erarbeitet: (!!! ICH bin Member_A !!!)

$sql  = "SELECT pn.pnid,pn.absender,pn.empfaenger,pn.icon,";
$sql .= "pn.betreff,pn.datum,m.id,m.name ";
$sql .= "FROM messages AS pn, member AS m ";
$sql .= "WHERE pn.empfaenger=m.id ";
$sql .= "AND m.name='".$_SESSION['nickname']."';";

$result = @mysql_db_query($datenbank,$sql_eingabe);

// *** PHP Part ***
while ($row = @mysql_fetch_row($result))
{
    hier sollen alle möglichen $row´s durchlaufen werden
}

Ergebnis-Tabelle sieht so aus:

+-------+--------+----------+-------+-------+---------------------+
|  pnid |absender|empfaenger| icon  |betreff| datum               |
|$row[0]| $row[1]|  $row[2] |$row[3]|$row[4]| $row[5]             |
+-------+--------+----------+-------+-------+---------------------+
|     1 |      2 |        1 |04.gif | Test1 | 2008-01-15 06:00:00 |
+-------+--------+----------+-------+-------+---------------------+
|     2 |      3 |        1 |02.gif | Test2 | 2008-01-15 07:00:00 |
+-------+--------+----------+-------+-------+---------------------+

Jeder sieht sofort was mein gewünschtes Ziel ist, die Spalte absender ($row[1]) in den eigentlichen Namen aufzulösen, hier 2 = Member_B sowie 3 = Member_C.

Hab Stundenlang nach passenden JOIN´s gesucht, und unzählige einfach probiert. Ein gewünschter Erfolg blieb leider bis dato aus :(

Ich brauch Eure hilfe *gggg*

Wie Stricke ich die passende SELECT Anweisung, und wenn wir schon mal dabei sind, gebt mir doch bitte auch einen Tip für die dazu passende INSERT Anweisung *liebguck*

Gruß Iron-Eagle

  1. Hallo,

    Hab Stundenlang nach passenden JOIN´s gesucht, und unzählige einfach probiert. Ein gewünschter Erfolg blieb leider bis dato aus :(

    Leseempfehlung:
    Fortgeschrittene Jointechniken
    Abschnitt Selfjoin erläutert die Notwendigkeit von Aliasnamen bei mehrfachem
    Join auf die gleiche Tabelle.

    messages;
    |pnid|absender|empfaenger| icon | betreff | datum               |
    |----+--------+----------+------+---------+---------------------+
    |  1 |      2 |        1 |04.gif|   Test1 | 2008-01-15 06:00:00 |
    |  2 |      3 |        1 |02.gif|   Test2 | 2008-01-15 07:00:00 |

    member;
    | id | name     |
    +----+----------+
    |  1 | Member_A |
    |  2 | Member_B |
    |  3 | Member_C |

    Ergebnis-Tabelle sieht so aus:
    |  pnid |absender|empfaenger| icon  |betreff| datum               |
    |$row[0]| $row[1]|  $row[2] |$row[3]|$row[4]| $row[5]             |
    +-------+--------+----------+-------+-------+---------------------+
    |     1 |      2 |        1 |04.gif | Test1 | 2008-01-15 06:00:00 |
    |     2 |      3 |        1 |02.gif | Test2 | 2008-01-15 07:00:00 |

    Jeder sieht sofort was mein gewünschtes Ziel ist, die Spalte absender ($row[1]) in den eigentlichen Namen aufzulösen, hier 2 = Member_B sowie 3 = Member_C.

    SELECT                       -- Gib mir  
        ms.pnid,                 -- die id der Nachricht,  
        ab.name,                 -- den Namen des Absenders  
        em.name,                 -- den Namen des Empfängers  
        ms.icon,                 -- das Icon der Nachricht  
        ms.betreff,              -- den Betreff der Nachricht  
        ms.datum                 -- das Datum der Nachricht  
    FROM  
        messages ms              -- aus der Nachrichtentabelle messages  
    INNER JOIN  
        member ab                -- die mit der Membertabelle, die hier die  
    ON                           -- Absender kennzeichnet über das Feld absender  
        ms.absender = ab.id      -- und id verknüpft ist.  
                                 -- Der Aliasname für die Tabelle member ist  
                                 -- notwendig, weil Du zweimal auf die gleiche  
                                 -- Tabelle zugreifst  
      
    INNER JOIN                   -- die Nachrichtentabelle messages ist mit  
        member em                -- der Tabelle member als Empfänger über die  
    ON                           -- Felder empfaenger und id verknüpft, für den  
        ms.empfaenger = em.id    -- Aliasnamen gilt wieder das gleiche  
    WHERE  
        em.name = <nickname>     -- nur Nachrichten des Empfängers <nickname>  
    
    

    Die Optimierung des Statements überlasse MySQL bzw. starte mit der Tabelle
    empfaenger, weil Du über die WHERE-Klausel deren Datensätze auf einen einzigen
    reduzierst :-)

    gebt mir doch bitte auch einen Tip für die dazu passende INSERT Anweisung

    Welches Problem hast Du mit dem INSERT? Welche Daten liegen vor, die
    gespeichert werden sollen?

    Freundliche Grüße

    Vinzenz

    1. SELECT                       -- Gib mir

      ms.pnid,                 -- die id der Nachricht,
          ab.name,                 -- den Namen des Absenders
          em.name,                 -- den Namen des Empfängers
          ms.icon,                 -- das Icon der Nachricht
          ms.betreff,              -- den Betreff der Nachricht
          ms.datum                 -- das Datum der Nachricht
      FROM
          messages ms              -- aus der Nachrichtentabelle messages
      INNER JOIN
          member ab                -- die mit der Membertabelle, die hier die
      ON                           -- Absender kennzeichnet über das Feld absender
          ms.absender = ab.id      -- und id verknüpft ist.
                                   -- Der Aliasname für die Tabelle member ist
                                   -- notwendig, weil Du zweimal auf die gleiche
                                   -- Tabelle zugreifst

      INNER JOIN                   -- die Nachrichtentabelle messages ist mit
          member em                -- der Tabelle member als Empfänger über die
      ON                           -- Felder empfaenger und id verknüpft, für den
          ms.empfaenger = em.id    -- Aliasnamen gilt wieder das gleiche
      WHERE
          em.name = <nickname>     -- nur Nachrichten des Empfängers <nickname>

        
      Hallo Vinzenz,  
      zuerst 1000 Dank für Deine schnelle, und dazu noch sehr professionelle Antwort. Deine Select-Anweisung hat direkt den erhoften Erfolg geliefert.  
        
      Des weiteren möchte ich Dir für die beiden Link-Hinweise danken, sie werde ich mir in einer ruhigen Stunde verinnerlichen. Denn mein Ziel ist es meinen persönlichen Horizont zu erweitern, dazu zählt auch das ich Deine Select-Klausel verstehe und vollständig nachvollziehen kann ;-)  
        
      Ich werd mich jetzt daran begeben, zu lösen wie ich Vorhandene Namen-Strings (zB.: "Member\_A" - Ich als Absender, und "Member\_B" als Empfänger) in die Werte 1 bzw. 2 umwandle um Sie in diese Messages-Tabelle wegschreiben zu können ^^  
        
      Auf jedenfall bin ich dank Dir schon einen ganzen Schritt weiter.  
        
      Grüße Marco