Moin!
In der Spalte Hausnummer gibt es nun z.B. folgenden Einträge:
1,2,3,..., 20,21a,...
bei einer SELECT... ORDER BY Strass, Hausnr Abfrage wird nun z.B. die "3" _nach_ der "20" ausgegeben, das ist ja auch die "richtige" lexikalische Ordnung, aber eben nicht die logische.
In PHP gäbe es die Funktion strnatcmp() für einen Stringvergleich, der Zahlen als Wert berücksichtigt, und nicht als String.
Leider bietet MySQL solch eine Vergleichsfunktion für die Sortierung nicht mit an. Du müsstest dir also behelfen, indem du alle Hausnummern so "vorbehandelst", dass die Stringsortierung zu den gewünschten Ergebnissen führt. Das ist leider schwieriger, als es sich anhört.
Denn einerseits: Die vorbehandelten Hausnummern können nicht in einer weiteren Tabellenspalte gespeichert werden, weil du nichts am Schema ändern willst. Andererseits: Für jede Abfrage die Hausnummern dynamisch mit komplexen Stringfunktionen zu behandeln, nur um die Sortierung richtig hinzubekommen, dürfte ganz schön auf die Performance gehen.
Jedenfalls: Die Vorgehensweise wäre, die Hausnummern erst einmal in zwei Teilen zu behandeln: Den Zahlenanteil und den eventuell folgenden Buchstabenanteil. Der Zahlenanteil wird mit führenden Nullen oder mit führenden Leerzeichen aufgefüllt, und zwar auf mindestens die Länge, die der Zahlenanteil der längsten Hausnummer lang ist. Der Buchstabenanteil kommt dann wieder hinten dran...
Die Sortierung vergleicht dann "0003" mit "0020" und "0020a", und wird die richtige Reihenfolge herstellen, auch mit nur einem schlichten Stringvergleich.
Ich bastel' dir aber die Funktion nicht hin, die diese Transformation durchführt.
Ausserdem gebe ich zu bedenken, dass Adressen ein höchst merkwürdiges Konstrukt sind. Ich verweise nur mal auf die Quadratestadt in Mannheim, oder auf die Möglichkeit, dass eine Adresse "Müllerstraße 43-47" lauten kann.
Für die Merkwürdigkeiten von Adressmaterial eine allumfassende Sortierlösung zu bauen kann durchaus zu einer sehr umfangreichen Aufgabe werden. Ich vermute mal, deine Datenbank ist schon etwas gefüllt, so dass du mal nachgucken könntest, was sich da schon alles angesammelt hat, um einen Eindruck zu bekommen.
- Sven Rautenberg