Hallo,
was du willst ist kein OUTER JOIN, schließlich willst du zu jeder plz in der user tabelle einen entsprechenden datensatz aus der geodata tabelle. wenn überhaupt, dann ist das ein INNER JOIN.
Nein, 'plz' ist keine Pflichtangabe und kann 'null' sein. Deshalb kann ich auch kein INNER JOIN draus machen, denn ich möchte alle betroffenen user ausgeben und nicht nur die, welche eine 'plz' angegeben haben.
du musst es entweder erst sortieren und dann mit limit einschränken
Ist richtig, hier fehlt das ORDER BY plz ASC. Ändert aber leider nichts an der ewig langen Abfragedauer. Wenn die angegebene 'plz' im niedrigen Bereich ist, muss immernoch fast die ganze 'geodata' abgefragt werden, um den MIN() zu errechnen.
Aber wie du in meiner Antwort auf MudGuards Beitrag entnehmen kannst, wurde das Konzept nun ohnehin geändert. Ich möchte nun einen übergeordneten Bereich heraussuchen (was auch das gesamte Abfragen und Ermitteln des MIN() erübrigt).
Mittlerweile habe ich eine Abfrage zusammengeschrieben, welche (endlich) das gewünschte Ergebnis ausgibt:
SELECT user.*, geodata.x, geodata.y, geodata.z
FROM user
LEFT JOIN geodata ON geodata.plz = (
IF (@a:=(SELECT plz FROM geodata WHERE plz=user.plz),@a,
IF (@b:=(SELECT plz FROM geodata WHERE plz=SUBSTR(user.plz,1,CHAR_LENGTH(user.plz)-1)),@b,
IF (@c:=(SELECT plz FROM geodata WHERE plz=SUBSTR(user.plz,1,CHAR_LENGTH(user.plz)-2)),@c,
IF (@d:=(SELECT plz FROM geodata WHERE plz=SUBSTR(user.plz,1,CHAR_LENGTH(user.plz)-3)),@d,
IF (@e:=(SELECT plz FROM geodata WHERE plz=SUBSTR(user.plz,1,CHAR_LENGTH(user.plz)-4)),@e,null)))))
)
ORDER BY ID ASC LIMIT 0,2
Dieses Codeschnipsel gibt nun die Daten für die ersten zwei user aus (als Beispiel) und sucht die entsprechenden Koordinaten zur PLZ. Existiert die PLZ nicht, wird nach einer übergeordneten gesucht (aus 12345 wird 1234). Existiert auch diese nicht, wirds dreistellig, usw.
Problem: Auch diese Abfrage bedarf wieder > 30sek bei gerademal zwei Usern von denen nur eine PLZ fehlerhaft ist. Das ist zu lang für einen Praxiseinsatz... Ideen?
Vielen Dank und Grüße,
Sebastian.