Hauptmenü

Untermenü

PHP/MySQL - Praxistutorial 3 - Theta/Inner Join

1. Die Abschnitte

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