PHP/MySQL - Praxistutorial 3 - Theta/Inner Join
1. Die Abschnitte
- Überblick
- Das Prinzip
- Theta/Inner Join
- Left/Right Join
- Zusatzbedingungen
- Relationstabellen
- Mehrere Tabellen verbinden
2. Zu Beginn
... fangen wir mal ganz einfach an. Dazu nehmen wir uns die data/produkte.php
vor, die per JavaScript aufgerufen wird,
wenn ihr im Hauptmenü bei den Produkten auf "Überblick" klickt. Dabei wollen wir alle Produkte samt den dazugehörigen Hersteller
aufrufen.
3. Die Abfrage
Bei den beiden folgenden Varianten gibt es identische Ergebnisse. Nur sehen die Abfragen ein wenig anders aus. Zu dem Unterschied komme ich gleich. Wir wollen hier also eine eindeutige Beziehung zwischen Datensätzen aus zwei Tabellen herstellen. Und dazu gibt es zwei Möglichkeiten.
Theta Style
Dies scheint für diese Schreibweise der gängige Begriff zu sein. Auch wenn man unter einem Theta Join wohl etwas anderes versteht. Allerdings kümmere ich mich herzlich wenig um Namen. Die sind nur Schall und Rauch. Also, die erste Variante sieht so aus.
$query = 'SELECT
p.produkt,
p.preis,
h.zulieferer
FROM
produkt p,
hersteller h
WHERE
p.hs_link = h.id
ORDER BY produkt';
Erläuterung
Zunächst mal wählen wir die entsprechenden Spalten in den beiden Tabellen aus. Damit aber MySQL weiß, wo es zu suchen hat,
benutzen wir Kürzel für die Tabelle, die wir im FROM
-Teil definieren, also produkt p
und hersteller
h
.
Das muss man nicht tun, man könnte auch im SELECT
zum Beispiel mit produkt.produkt
und
hersteller.zulieferer
arbeiten. Also zuerst den Tabellen- und dann den Spaltennamen. Das p
und h
kann man sich hier im FROM
sparen. Obige Schreibweise erspart euch also nur ein wenig Tipparbeit.
Das Wichtige ist die WHERE
-Bedingung. Denn erst dort wird die Relation der einzelnen Datensätze zueinander hergestellt
über p.hs_link = h.id
. Also soll der Wert der Spalte hs_link
in der Tabelle produkt
identisch
sein mit der Spalte id
in der Tabelle hersteller
. Ansonsten bekommt ihr nur Müll zurück geliefert. Probiert
es ruhig mal aus und spielt mit der Abfrage herum, dann seht ihr es. Ach ja, das ORDER BY
sortiert die Datensätze
alphabetisch absteigend nach den Produkten. Aber das nur am Rande. Ist nicht so wichtig.
Inner Join (ANSI Style)
$query = 'SELECT
p.produkt,
p.preis,
h.zulieferer
FROM
produkt p
INNER JOIN
hersteller h ON p.hs_link = h.id
ORDER BY
produkt';
Erläuterung
Dies ist das Pendant zur ersten Variante. Nur erfolgt die logische Verknüpfung über den INNER JOIN
-Teil. Der entspricht
der WHERE
-Bedingung aus obigem Code. Das INNER JOIN hersteller h ON p.hs_link = h.id
ist also in etwa gleich
bedeutend mit WHERE p.hs_link = h.id
.
Der Unterschied
... zwischen beiden Stilen ist einfach zu erklären, auch wenn es hier nicht von Belang ist. Wenn man beim Theta Style zusätzlich noch mit einem
oder mehreren Joins arbeiten muss, so geht das nur mit der letzten(!) Tabelle aus dem FROM
-Abschnitt. Die folgende Abfrage
wirft dann ein SQL-Fehler à la unkown column k.zm_link
. Auf die Feinheiten werde ich ein einem kommenden Tutorial eingehen.
SELECT
p.produkt,
p.preis,
h.zulieferer,
z.art
FROM
hersteller h,
kunde k,
produkt p
LEFT JOIN
zahlungsmoral z ON (k.zm_link = z.id)
WHERE
p.hs_link = h.id
ORDER BY produkt
4. Die Auswertung
Baut den folgenden Code zusammen mit dem $query
unterhalb des require ('../inc/db.inc.php');
in der
data/produkte.php
ein und ihr bekommt die korrekten Ergebnisse angezeigt.
$query = '...';
$result = mysql_query ($query) or die (mysql_error());
while ($row = mysql_fetch_assoc($result))
{
echo '<tr>
<td>'.$row['produkt'].'</td>
<td>'.$row['preis'].'</td>
<td>'.$row['zulieferer'].'</td>
</tr>';
}
Wer damit Probleme hat, der sollte sich erst mal die ersten beiden Praxistutorials zu Gemüte führen. Oder sich den Lösungscode ansehen. Auch wenn diese Vorgehensweise nicht das Gelbe vom Ei ist. Ihr wollt ja was lernen.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt