• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

[ERLEDIGT] Sortierung bei Ausgabe

thuemmy

Aktives Mitglied
Ich habe da ein kleines Problem bei der Ausgabe eines SQL-Queries. Ich habe eine Tabelle und diese enthält ein Feld namens 'nummer'. Dummerweise ist dieses Feld ein varchar, und zwar wegen eines einzigen Ausreißers, die Nummer '5c'. Die numerische Sortierung ist daher aus dem SQL herraus nicht möglich. Macht es nun Sinn, mit dem Ergebnis aus der SQL-Abfrage ein Array mit sprintf zu befüllen, ist so oder so nur der Wert aus dem Feld 'nummer', und das Array zu sortieren, oder ist es besser schon beim SQL-Querie anzusetzen?
 
Werbung:
Das kann man auch per SQL lösen. MySQL kann auch Textfelder sortieren. Allerdings bin ich mir nicht sicher, wie der Eintrag "5c" innerhalb einer Sortierung von reinen Zahlen a la

Code:
ORDER BY nummer ASC

einsortiert werden würde. Evtl. wäre es hilfreich alle auf die gleiche Zeichenanzahl zu bringen, z.B. per

Code:
ORDER BY IF(LENGTH(nummer) == 2, nummer, CONCAT(nummer,'a')) ASC

Dann hätten alle außer den 2stelligen nummer-Einträgen ein "a" hinten dran. Ein "5a" müsste dann eigentlich vor "5c" kommen.
 
Danke für Deine Antwort, allerdings verstehe ich das mit dem CONCAT nicht so, wie Du das da schreibst :???: In der Zwischenzeit habe ich den Weg über das sortieren eines Array eingebaut. Zumal an Deinem Hinweis ist eine Sache eben nicht richtig, mein "Nummern"-Kreis geht von 1 - 360, mit eben der einen Ausnahme von 5c. Ich fülle nun ein Array durch sprintf:
001
002
003
004
005
005c
006
:
:
010
011
:
:
359
360
Klappt auf jeden Fall.
 
Werbung:
Genau das kannst Du auch mit MySQL machen. Nochmal zur Erklärung:

Code:
ORDER BY

"sortiere nach" ..

Code:
IF(LENGTH(nummer) == 2,

wenn der Eintrag im Feld nummer die Länge 2 hat, dann nimm

Code:
nummer

ansonsten

Code:
CONCAT(nummer,'a'))

verbinde den Eintrag im Feld Nummer mit dem Wert a (4 -> 4a, 5 -> 5a ...) und

Code:
ASC

sortiere das ganze aufsteigend.

Bezogen auf deine 3stelligen Zahlen könnte man das natürlich auch erweitern:

Code:
ORDER BY 
 IF(
  LENGTH(nummer) == 3, 
  nummer, 
  IF( LENGTH(nummer) == 2,
    CONCAT(nummer, '0'),
    CONCAT(nummer, '00')
  )
) ASC

Ergibt z.B.

4 --> 400
12 --> 120
5c -> 5c0

Warum so herum und nicht wie bei dir mit 00 führend?
In deinem Fall setzt Du ja dennoch bei 5c das c hinten dran. Daher stimmt die Sortierung dann eigentlich auch nicht wirklich. Du müsstest 5c in die Reihe einbeziehen, also

500
5c0
600

statt

005
005c
006

da Du mit 5c einen 4stelligen String erzeugst der allein durch seine Länge anders ist als die anderen Strings.
 
Entweder ich bin noch nicht richtig wach, oder Du hast das Problem noch nicht verstanden (was ich allerdings eher weniger glaube). Was ich erzielen will, dass ist die Ausgabe: 1 2 3 4 5 5c 6 .... 10 11 12 13 ... 99 100 101 usw. Bei Deinem Vorschlag mit den nachfolgenden Nullen weiß ich ja bei dem Wert 300 nicht, isses eine 3, eine 30 oder doch die 300?
 
Werbung:
Zurück
Oben