Advanced SQL - Einstiegstutorial 3 - Subselect Teil 3
1. Die Abschnitte
- Vorwort
- Stored Procedure
- View
- Subselect Teil 1
- Subselect Teil 2
- Subselect Teil 3
2. Die komplette Abfrage
Und diesmal der Übersichtlichkeit halber tiptop formatiert.
SELECT
a.id,
m1.id AS vonid,
m1.name AS von,
m2.id AS anid,
m2.name AS an,
m3.id AS fuerid,
m3.name AS fuer,
a.preis,
a.typ,
c.gold,
w.wesen,
s.stufe
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
mitglied m1 ON m1.id = a.von
INNER JOIN
mitglied m2 ON m2.id = a.an
INNER JOIN
mitglied m3 ON m3.id = a.fuer
INNER JOIN
charakter c ON c.id = m3.charakter
INNER JOIN
stufe s ON s.id = c.stufe
INNER JOIN
wesen w ON w.id = c.wesen
Das Ergebnis
... sieht dann so aus. Ach ja, auch hier musste ich mal wieder Photoshop zu Hilfe nehmen, wegen der Leute mit der kleinen Bildschirmauflösung. Ihr müsst euch also (mal wieder) die Spalten unterhalb des roten Strichs rechts neben der oberen Spalten befindet. Ach was, schaut euch das Ergebnis einfach im MySQL-Frontend eurer Wahl an.
3. Merke!
Wenn man mit so einen Konstrukt arbeitet, dann muss man ein paar Regeln beachten. Als da wären Folgende.
-
Alle Felder, die in der Hauptabfrage genutzt und sich auf Spalten im Subselect beziehen, müssen bei Letzterem in der
SELECT
-Anweisung auftauchen. -
Bei eindeutigen Spaltennamen im Subselect ist es egal, ob man mit einen verkürzten Tabellennamem á la
a.id
odert.typ
arbeitet. -
Wenn man mit einem Alias, hier
AS fuer
arbeitet, so kann darf man nicht mit einem verkürzten Tabellennamem arbeiten.
4. Fazit
Wie ich schon mehrmals erwähnte, sind alle Beispiele aus diesem Tutorial auf den ersten (und auch zweiten) Blick teilweise ziemlich sinnfrei. Aber darauf werde ich bei den folgenden Praxuistutorials eingehen.