PHP/MySQL - Praxistutorial 3 - Zusatzbedingungen
1. Die Abschnitte
- Überblick
- Das Prinzip
- Theta/Inner Join
- Left/Right Join
- Zusatzbedingungen
- Relationstabellen
- Mehrere Tabellen verbinden
2. Erweiterungen
Bisher haben wir nach gewissen Kriterien einfach alle Datensätze geholt, die vorhanden sind. Jetzt geht es um weitere Einschränkungen,
die man direkt in den SQL-Abfragen vornehmen kann. Dazu nehmen wir die beiden bereits verwendeten Dateien data/produkte.php
und data/kunden.php
. Aus Anschauungsgründen zeige ich euch nur die Abfragen. Einbauen und verarbeiten müsst die selbst.
Und das gilt auch für das Verstehen. So schwer ist das nun wirklich nicht.
3. Einschränkung der Produkte
Bisher haben wir in der data/produkte.php
uns alle Produkte geholt, zu denen es einen Hersteller gibt. Wenn man sich da
zum Beispiel nur diejenigen ausgeben lassen möchte, deren Preis einen bestimmten Wert überschreitet, so packt man das einfach in eine
WHERE
-Bedingung.
SELECT
p.produkt,
p.preis,
h.zulieferer
FROM
produkt p
INNER JOIN
hersteller h ON p.hs_link = h.id
WHERE
p.preis > 20
ORDER BY
produkt
Vielleicht versteht ihr jetzt, warum der Theta Join nicht gerne gesehen ist. Denn bei einem
INNER JOIN
ist das Ziel der Abfrage deutlicher zu erkennen. Und das ist besonders wichtig, wenn man mit mehreren Entwicklern
zusammenarbeitet. Ansonsten brauche ich zur Abfrage wohl nichts mehr zu sagen. Das ist Hödelpups.
4. Einschränkung der Kunden
Vorab! Welche Datei ihr dafür benutzt, sag ich euch nicht mehr. Ätsch! Will man also zum Beispiel herausfinden, wessen Zahlungsmoral nicht
so prickelnd ist, dann hat man zwei Möglichkeiten. Man kann dann den Eintrag in der Tabelle zahlungsmoral
auf einen bestimmten
Wert hin prüfen, also so.
SELECT
k.doktor,
k.telefon,
z.art
FROM
kunde k
LEFT JOIN
zahlungsmoral z ON k.zm_link = z.id
WHERE
z.art != 'sehr gut' AND z.art != 'gut'
ORDER BY doktor'
Wer hier nicht sauber arbeitet, bekommt einen Parse error
um die Ohren gehauen. Und woran liegt das wohl? Genau! An den
Hochkommate, die ihr Torfnasen mal wieder nicht korrekt escaped habt.
Aber!
Ihr seht keine Kunden, bei denen es noch keinen Eintrag zur Zahlungsmoral gibt. Darum muss man die WHERE
-Bedingung
entsprechend anpassen und für eine saubere Logik bei z.art
mit Klammern arbeiten, um die Bedingung zu bündeln. Aber
das kennt ihr ja schon.
SELECT
k.doktor,
k.telefon,
z.art
FROM
kunde k
LEFT JOIN
zahlungsmoral z ON k.zm_link = z.id
WHERE (z.art != 'sehr gut' AND z.art != 'gut')
OR k.zm_link IS NULL
ORDER BY doktor
Natürlich gibt es für so einen Fall auch noch andere Möglichkeiten. Aber damit könnt ihr euch ja jetzt selber beschäftigen.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt