MySQL - ID-Spalte tb1(FK) mit Werten aus tb2(PK) auflösen
Iron-Eagle
- datenbank
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
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
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 zugreifstINNER 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