V. 8.7 (27.03.2012)

Infos

Download

Praxistutorial 3 PHP/MySQL

Daten

Basiscode

Lösung

Schnellsuche

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. Fragt mich jetzt bitte nach dem Unterschied. Da scheinen sich selbst die Experten zu streiten. Wendet euch im Zweifelsfall an einen Informatiker. Ach ja, der Hersteller von MySQL empfiehlt die zweite Variante. Außerdem kann man dann bei möglichen WHERE-Klauseln zusätzlich unterscheiden. Egal, wir wollen hier 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.

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.

weiter zum nächsten Abschnitt