Advanced SQL - Einstiegstutorial 3 - Subselect Teil 2
1. Die Abschnitte
- Vorwort
- Stored Procedure
- View
- Subselect Teil 1
- Subselect Teil 2
- Subselect Teil 3
2. Und nun eine Alternative
Wie ich im vorherigen Abschnitt schon sagte, wird euch der Sinn zu dieser Vorgehensweise nicht ganz einleuchten. Das kommt aber später in den Praxistutorials.
Zunächst wollen wir mal diesen Müll mit den unterschiedlichen Spalten fuer
/tausch
und fuerid
/tid
beseitigen.
Und dafür bauen wir uns zuerst ein kleines SQL-Statement.
SELECT
a.id,
IF(a.fuer IS NULL, t.mitglied, a.fuer) AS fuer,
t.typ, a.von, a.an, a.preis
FROM angebot a
LEFT JOIN tausch t ON (t.angebot = a.id)
Das Ergebnis sieht dann so aus.
Erläuterung
Wirklich interessant ist hier nur die Anweisung IF(a.fuer IS NULL, t.mitglied, a.fuer) AS fuer
. Denn da arbeiten wir mit einer einfachen
Bedingung. Wenn a.fuer
den Wert NULL
hat, also bei einem Tauschangebot, dann wird die ID von t.mitglied
genommen.
Ansonsten die von a.fuer
. Somit haben wir alle IDs der angebotenen Spieler in einer Spalte. Aber wie hilft uns das weiter?
3. Ganz einfach
Wir nehmen obiges SQL-Statement als Unterabfrage (Subselect) für unsere eigentliche Suchanfrage und können so bei den folgenden Anweisungen sauber mit einem
INNER JOIN
arbeiten.
SELECT
a.id,
...
FROM
(
SELECT
a.id,
IF(a.fuer IS NULL, t.mitglied, a.fuer) AS fuer,
t.typ, a.von, a.an, a.preis
FROM angebot a
LEFT JOIN tausch t ON (t.angebot = a.id)
)
AS a
INNER JOIN ...
Erläuterung
Ganz wichtig ist das AS a
! Denn damit erzeugt man eine Art von Referenz, die in diesem (extrem verkürzten) Beispiel für den Wert a.id
in der SELECT
-Anweisung benötigt wird. Das gilt ebenso für AS fuer
in unserem Subselect. Denn das steht dann in der Hauptabfrage
als a.fuer
zur Verfügung. Natürlich gilt das auch für die übrigen Spalten t.typ
, a.von
, a.an
und a.preis
.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt