[mysql] Absteigende Sortierung funktioniert nicht

mr5

Banned
Registriert
Feb. 2005
Beiträge
1.041
Hallo allerseits,

irgendwie sortiert er mir bei folgendem Befehl die kundennummern nicht richtig.

Code:
$query = "SELECT * FROM `angemeldete_kunden` ORDER BY `kundennummer` DESC";

Das Feld Kundennummer ist als TEXT spezifiziert.

Jetzt zeigt er mir folgende Rangfolge an:

20073
20072
20071
20070
200413
200412
200411
usw..

Was haben denn die Anzahl der Stellen damit zutun? Habt Ihr einen Tipp für mich?

Danke im Voraus... Stefan
 
den grund für die sortierung hast du doch selber geschrieben. "Das Feld Kundennummer ist als TEXT spezifiziert." probier es mal mit einem zählbaren typ für kundennummer.
 
Es sortiert Alphabetisch:

"ac" kommt demnach vor
"ab"

Die Datei erkennt nicht, dass es sich um Zahlen handelt und sortiert folglich nciht na deren "Größe"!
 
Die Sortierung ist doch absolut richtig.
2007 kommt doch vor 2004. Die Länge der Zahl ist dabei unerheblich.
 
@schmidmi
Wenn man arithmetisch sortieren möchte, spielt die Länge der Zeichenkette eine größere Rolle als etwaige Teilstrings... Kundennummern haben nicht zwangsläufig etwas mit Jahreszahlen zu tun.

@mr5
Wenn du literale Werte arithmetisch vergleichen möchtest, kannst du durch implizites oder explizites Casting einen arithmetischen Vergleich erzwingen.

greetings, Keita
 
Ja, klar ist die Sortierung richtig. Warum sollte auch plötzlich der Sortiervorgang in php/mysql nicht mehr funktionieren? ;)

Er möchte aber - wie es auch normal ist - die Zahlen nach ihrer Größe sortieren, so dass - wie ghorst schon schrieb - eine Änderung des Typs notwendig ist. Mit "int" ist man hier auf der sicheren Seite, wahrscheinlich reicht sogar ein "mediumint". Sowas als Typ "text" abzuspeichern, ist auf jedenfall Performancekiller schlechthin, sofern sich in der Spalte tatsächlich nur Zahlen verbergen, wonach es ja ausschaut. ;)
 
edit: ich sollte genau lesen bevor ich schreibe... mea culpa.

neuer text: eure generierung für kundennummern ist ein bisschen unglücklich (spontan habe ich auf jahreszahl+nummer getippt), um sie sinnvoll zu sortieren. am einfachsten nimmst du nur aufsteigende nummer für deine/eure kunden.
wenn du das, was du hast, sinnvoll sortieren willst, musst du erst die jahreszahl extrahieren und nach der sortieren, danach nach der kundennummer, sonst klappt das weder mit int, date noch mit text.
 
Zuletzt bearbeitet:
Danke an alle für die Antworten.

@mr5
Wenn du literale Werte arithmetisch vergleichen möchtest, kannst du durch implizites oder explizites Casting einen arithmetischen Vergleich erzwingen.

greetings, Keita

Ja genau das ist das Hauptproblem. Literale Werte arithmetisch vergleichen - das wahr wohl der Fehler, das hatte ich mir auch schon fast gedacht, nur wie drückt man das in der Fachsprache aus ? Wonach sucht man im Google? Keita, Du wandelndes Fremdwortlexikon! :D. Daanke! :bussi:
 
Zuletzt bearbeitet:
Leider finde ich nix im Google.

Keita schreibst Du bitte noch 2 Sätze wie man durch implizites oder explizites Casting einen arithmetischen Vergleich erzwingen kann?

Vielleicht ein kleines Beispiel? :D

http://www.edv-logistik.net/downloads/mySQL_Handbuch.pdf

Hier habe ich noch ein schönes MYSQL-Handbuch im Netz gefunden.
 
Wenn sich deine Kundennummern arithmetisch sortieren ließen, wäre ein impliziter Cast sowas wie
Code:
kundennummer + 0
und ein expliziter Cast
Code:
CAST(kundennummer as SIGNED)
bzw.
CONVERT(kundennummber, SIGNED)
Aber wie ghorst schon geschrieben hat, ist das Schema für die Nummernvergabe alles andere als optimal, weil der Prefix (Jahreszahl) einem anderen Schema folgt als der Postfix (durchlaufende Nummer). Sinnvoller wäre es gewesen, den Postfix mit einer fixen Länge zu versehen, die Länge hängt dabei vom Umfang des gewünschten Nummernkreises ab:
Code:
200700003 
200700002 
200700001 
200700000 
200400013
200400012
200400011
Auf diese Weise lassen sich die Kundennummern problemlos literal sortieren, nicht ohne Grund werden bspw. beim ISO-Datum Monat und Tag mit einer führenden 0 versehen:
Code:
2007-01-13
2007-04-01
2007-11-30

Ach ja, solange man keine arithmetischen Operationen auf eine Spalte anwenden muß, sollten auch numerische Werte als Literale behandelt werden, in diesem Fall wäre INTEGER als Datentyp semantisch falsch.

greetings, Keita
 
Vielen Dank soweit.

Ich habe mir auch gedacht, ob ich nicht den Kundennummern eine bestimmte Länge geben sollte. Nur wie viele Kunden wird man haben? Also gleich mal 6-stellig?

Des weiteren lege ich selber die Kunden an. Ich hatte eigentlich keine Lust z.B. 20070000012, also ständig Nulllen einzutippen.

So bin ich bei
20071 (2007 für das Jahr, 1 für den ersten Kunden).
20072
20073
usw...
2007123
2007124
usw...

Das sortiert er mir aber arithmetisch falsch. Und wenn ich die höchste (nicht die letzte) vergebene Kundennummer mir anzeigen lassen will, muss ich das ganze sortieren lassen.

Irgendwie werde ich aus Deinen Ausführungen nicht schlau.

Kannst Du mir vielleicht einfach diese Anfrage umstellen?

Code:
$query = "SELECT * FROM `angemeldete_kunden` ORDER BY `kundennummer` DESC";

Danke,
Gruß
Stefan
 
Zuletzt bearbeitet:
nochmal ganz langsam: so wie du deine kundennummer bisher vergeben hast, lassen sie sich nicht sinnvoll sortieren. entweder du gehst den weg, den keita vorschlug und fügst eine hinreichende anzahl an pflichtstellen für die fortlaufende nummer ein (das führt dann dazu, dass du führenden nullen hast und gefahr läufst, dass du die größe zu gering gewählt hast und dann keine neuen kunden mehr in das jahr bekommst.) oder du lässt die jahreszahl ganz weg und nimmst nur noch fortlaufende kundennummern.

wenn du deine namensgebung behalten willst, könnte das so gehen:
(kundennummer nehm ich mal als string an.)
$query = "SELECT * FROM `angemeldete_kunden` ORDER BY CAST ( substring (`kundennummer`,1,4) as SIGNED) DESC, CAST ( substring (`kundennummer` from 5) as SIGNED) DESC";

ob das tatsächlich funtktioniert, will ich hier mal nicht garantieren. hab gerade kein mysql hier. ;-)
 
Zuletzt bearbeitet:
Zurück
Oben