Hauptmenü

Untermenü

PHP/MySQL - Praxistutorial 3 - Left/Right Join

1. Die Abschnitte

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