Rolf B: Verschachtelte WHERE Abfragen Mysql

Beitrag lesen

Hallo Nobbi,

wenn Du mit einem SELECT DISTINCT beispielsweise 10117 Berlin bekommst, dann können dahinter viele Datensätze liegen, deren Inhalte aber unterschiedlich sind.

Zum Beispiel Pariser Platz 2 (USA Konsulat), Unter den Linden 77 (Hotel Adlon) oder Unter den Linden 78 (Dunkin' Donuts gleich gegenüber).

Was willst Du da denn ausgeben?

Wenn Du eine Abfrage haben willst, die dir alle Sätze auflistet, die vom SELECT DISTINCT zusammengefasst wurden, dann brauchst Du tatsächlich eine Schachtelung und einen JOIN. Ich zeige ihn zwar mal vor, aber verwende ihn bitte nur, um den DB-Server zum Rösten von Popcorn auf Betriebstemperatur zu bringen - denn das gleiche Ergebnis bekommst schneller, wenn Du einfach nur in der Adressentabelle nach ort="Berlin" suchst. Eine Query dieser Art ist sinnvoll, wenn die DISTINCT-Query nicht nach dem Ort sucht, sondern nach irgendwas anderem. Wenn Du alle Adressen aus den PLZ-Bereichen willst, wo ein Mensch namens "Müller" wohnt, zum Beispiel. Das wäre was für eine Rasterfahndung...

SELECT a.name, a.vorname, a.plz, a.ort, a.anschrift
FROM (SELECT DISTINCT plz, ort 
          FROM adressen 
          WHERE ort = 'Berlin') d
     JOIN adressen a ON a.plz = d.plz AND a.ort = d.ort

JOIN kennst Du vielleicht, damit verknüpft man zwei Tabellen über gemeinsame Spaltenwerte. Normalerweise schreibt man da sowas wie table1 JOIN table2 ON ..., aber das Ergebnis eines SELECT ist ebenfalls eine Table und kann deshalb in einem Join genauso verwendet werden.

Diese Query geht sozusagen in zwei Schritten vor. Im ersten Schritt werden alle Postleitzahlen gesucht, die zu Berlin gehören. Das ergibt eine temporäre Tabelle aus einigen Zeilen und 2 Spalten: plz und ort. Im zweiten Schritt wird diese temporäre Tabelle mit der Adressen-Table geJOINt und für jeden Satz in der temporären Tabelle die Adressen herausgesucht, die diese PLZ und diesen Ort haben.

Weil nun die gleichen Spaltennamen (plz und ort) mehrfach vorkommen, bekommen die Abfrageergebnisse Aliasnamen. Das ist das a und das d, was hinter der DISTINCT-Abfrage und hinter der geJOINten Adressentabelle steht. Diese Aliasnamen werden dann verwendet, um anzugeben, aus welcher Tabelle man PLZ oder ORT haben will.

Rolf

--
sumpsi - posui - obstruxi