Hauptmenü

Untermenü

Advanced SQL - Einstiegstutorial 3 - Subselect Teil 1

1. Die Abschnitte

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 vonidm1.name AS von,
  m2.id AS anidm2.name AS an,
  m3.id AS fueridm3.name AS fuer,
  m4.id AS tidm4.name AS tausch,
  t.typa.preisc.gold,
  w.wesens.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.

Subselect 1

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