Advanced SQL - Einstiegstutorial 3 - Subselect Teil 1
1. Die Abschnitte
- Vorwort
- Stored Procedure
- View
- Subselect Teil 1
- Subselect Teil 2
- Subselect Teil 3
2. Unser mieses Design
Tja, da hab ich der Modellierung ziemlich Bockmist gebaut. Und das müsst ihr nun ausbaden. Der Grund dafür ist die Tabelle tausch
, in der wir
unsere Tauschangebote abspeichern. Denn wenn wir uns nun alle Angebote (also die direkten und die zum Tauschen) holen wollen, so haben wir ein kleines Problem.
Ein Hinweis
Das eigentliche Problem bei dieser Geschichte könnt ihr hier noch nicht erkennen. Aber bei den kommenden Praxistutorials werdet ihr damit definitiv konfrontiert. Und darum zeige ich euch diese seltsam anmutende Lösung, auch wenn die im Moment ziemlich sinnfrei aussieht.
3. Die Abfrage
... habe ich aus Platzgründen ein wenig zusammengestaucht, damit ihr euch keinen Wolf scrollen müsst. Das Prinzip solltet ihr ja mittlerweile kennen. Wir holen
uns per zig LEFT JOIN
alles, was nicht niet- und nagelfest ist.
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,
m4.id AS tid, m4.name AS tausch,
t.typ, a.preis, c.gold,
w.wesen, s.stufe
FROM angebot a
LEFT JOIN tausch t ON t.angebot = a.id
LEFT JOIN mitglied m1 ON m1.id = a.von
LEFT JOIN mitglied m2 ON m2.id = a.an
LEFT JOIN mitglied m3 ON m3.id = a.fuer
LEFT JOIN mitglied m4 ON m4.id = t.mitglied
LEFT JOIN charakter c ON c.id = m3.charakter
LEFT JOIN stufe s ON s.id = c.stufe
LEFT JOIN wesen w ON w.id = c.wesen
Erläuterung
Eigentlich sollte euch die Sache mit den unzähligen Joins mittlerweile vertraut sein. Darum gehe ich nur auf eine Besonderheit ein, die ich bis jetzt noch nicht erwähnt habe. Glaube ich zumindest. Und meinen kompletten Auftritt danach abzusuchen, ist mir einfach zuviel Arbeit. Aber das ist egal.
Die Sache mit den mx.irgendwas
Tja, das ist eine elegante Art, um bestimmte Zuordnungen vorzunehmen, wenn sich die Informationen in identischen Spalten befinden. In diesem Fall treffen wir bei den Gildemitgliedern und den Angeboten eine saubere Unterscheidung zwischen dem Anbieter, demjenigen, der das Angebot bekommt und die arme Sau, die die Seiten wechseln soll.
m1
ist derjenige, der ein Angebot macht.m2
ist derjenige, der ein Angebot erhält.m3
ist derjenige, für den das Angebot gilt.m4
sind alle, die getauscht werden sollen.
4. Aber!
Das Ergebnis ist nicht so pralle. Zum einen müssen wir überall einen LEFT JOIN
verwenden (probiert es mal an der einen oder anderen Stelle mit
INNER JOIN
) und zum anderen ist das Resultat ziemlich blöde, um es vernünftig zu verarbeiten.
Ein Hinweis
Da immer noch über 5% meiner Besucher mit einer Auflösung von 1024x768 arbeiten, musste ich das Bild (Screenshot aus HeidiSQL) entsprechend verkleinern und die Spalten untereinander setzen. Stellt euch einfach vor, dass sich unterhalb des roten Strichs alles recht neben der oberen Spalten befindet.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt