PHP/MySQL - Praxistutorial 3 - Left/Right Join
1. Die Abschnitte
- Überblick
- Das Prinzip
- Theta/Inner Join
- Left/Right Join
- Zusatzbedingungen
- Relationstabellen
- Mehrere Tabellen verbinden
2. And now for something completly different
Das sagte John Cleese immer im Flying Circus,
wenn etwas Neues kam. Und das machen wir jetzt auch, weil wir uns alle Kunden und deren Zahlungsmoral ausgeben lassen wollen. Die Betonung
liegt dabei auf alle Kunden. Also arbeiten wir entsprechend in der Datei data/kunden.php
.
3. Das Problem
Wenn ihr mal in die Tabelle kunde
schaut, so seht ihr, dass es bei zwei von denen keinen Eintrag zur Zahlungsmoral gibt.
Man kann also nicht mit einem INNER JOIN
arbeiten. Denn da bekäme man ja nur die Kunden angezeigt, wo ein Eintrag vorhanden
ist, also die ersten vier.
4. Die Abfrage
Darum arbeiten wir in diesem Fall mit einem LEFT JOIN
. Für diejenigen, die sich immer noch nicht(!) die
Theorie zu Gemüte geführt haben, erkläre ich es ganz kurz. Bei dieser Art der Verknüpfung wird
zuerst alles aus der eigentlichen Tabelle geholt und dann erst die passenden Inhalte aus der zweiten. Ist in der ersten Tabelle kein
Verweis auf einen Eintrag in der zweiten vorhanden so wird an der Stelle ein NULL
gesetzt. Der Query sieht dann so aus.
$query = 'SELECT
k.doktor,
k.telefon,
z.art
FROM
kunde k
LEFT JOIN
zahlungsmoral z ON k.zm_link = z.id
ORDER BY doktor';
Erläuterung
Den SELECT
- und ORDER BY
-Teil solltet ihr mittlerweile selber begriffen haben, denn dazu sage ich nichts mehr.
Konzentrieren wir uns auf den schäbigen Rest. Zunächst definieren wir hinter dem FROM
die "Haupttabelle", also
kunden
. Und die verknüpfen wir "links herum" mit der Tabelle zahlungsmoral
über die dafür notwendigen
Felder (LEFT JOIN zahlungsmoral z ON k.zm_link = z.id
.
5. Die Auswertung
Den folgenden Code baut ihr in der schon erwähnten data/kunden.php
zusammen mit obigem Query unterhalb von
require ('../inc/db.inc.php');
ein. Dann seht ihr auch das Ergebnis.
$result = mysql_query ($query) or die (mysql_error());
while ($row = mysql_fetch_assoc($result))
{
echo '<tr>
<td>'.$row['doktor'].'</td>
<td>'.$row['telefon'].'</td>
<td>'.$row['art'].'</td>
</tr>';
}
6. Und jetzt anders herum
Damit ihr wisst, wie nun ein RIGHT JOIN
funktioniert, müsst ihr in der Abfrage das LEFT
nur durch
RIGHT
ersetzen. Dabei läuft die Verknüpfung anders herum. Es werden nun alle Datensätze aus der Tabelle
zahlungsmoral
geholt und mit den entsprechenden Einträgen aus der Tabelle kunde
verknüpft.
Probiert es einfach aus, dann versteht ihr das Prinzip. Allerdings sollte in diesem Fall die Ausgabe geändert werden, damit sie sinnvoller ist. Aber das macht ihr schön selber. Oder schaut den Lösungscode an. Da habe ich beide Varianten eingebaut und ihr müsst nur den "Left"-Code durch den "Right"-Code ersetzen. Also das eine auskommentieren und bei dem anderen die Kommentarzeichen entfernen.
Ein Hinweis
Right Joins sind, soweit ich das beurteilen kann, ziemlich verpönt. Das hat wohl mit der menschlichen Denkweise zu tun. Darum
sollte man im zweiten Fall korrekterweise auch mit einem sauberen LEFT JOIN
arbeiten, weil da offensichtlicher ist,
welche Daten wichtiger sind.
$query = 'SELECT
k.doktor,
k.telefon,
z.art
FROM
zahlungsmoral z
LEFT JOIN
kunde k ON k.zm_link = z.id
ORDER BY doktor';
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt