Hallo,
wäre es im inneren Select nicht günstiger, mit min zu arbeiten?
SELECT MIN(plz) FROM geodata WHERE plz >= user.plz
Das war auch mein erster Ansatz, hat aber keinen (nennenswerten) Unterschied gebracht. Eher noch brauchte diese Anfrage deutlich länger bis zum Ergebnis.
Abgesehen davon halte ich das Verfahren, einfach die nächsthöhere Postleitzahl zu benutzen, für fragwürdig.
Habe gelesen, das sei die gängige Praxis. Allerdings könnte ich die Abfrage auch anders gestalten. Ohnehin habe ich "Durchschnittswerte" erzeugt für alle übergeordneten PLZ-Bereiche (also bsp. 44 für 44???). Neuer Ansatz wäre demnach, die letzte Ziffer zu streichen, sollte die angegebene PLZ nicht gefunden werden. Eine Entsprechende CASE-Anweisung konnte ich auch bereits zusamenbasteln, aber wieder tritt meine Problematik auf. Ebenso versuchte ich es mit verschaltelten IF's bzw. XOR...
Kann ich nicht "einfach" die LEFT JOIN Abfrage auf ein Ergebnis begrenzen ohne dort ein verschachteltes SELECT einbauen zu müssen?
Grüße,
Sebastian
PS: Die Anweisung sähe derzeit (fehlerhaft) so bei mir aus:
SELECT user.*, geodata.x, geodata.y, geodata.z
FROM user
LEFT JOIN geodata ON geodata.plz =
CASE user.plz WHEN geodata.plz THEN user.plz
WHEN SUBSTR(user.plz,1,CHAR_LENGTH(user.plz)-1) THEN SUBSTR(user.plz,1,CHAR_LENGTH(user.plz)-1)
WHEN SUBSTR(user.plz,1,CHAR_LENGTH(user.plz)-2) THEN SUBSTR(user.plz,1,CHAR_LENGTH(user.plz)-2)
WHEN SUBSTR(user.plz,1,CHAR_LENGTH(user.plz)-3) THEN SUBSTR(user.plz,1,CHAR_LENGTH(user.plz)-3)
WHEN SUBSTR(user.plz,1,CHAR_LENGTH(user.plz)-4) THEN SUBSTR(user.plz,1,CHAR_LENGTH(user.plz)-4)
END
LIMIT 0,2