Zahlen sortieren mit MySQL
Michael
- datenbank
Hallo,
Ich würde gerne wissen wie man mit MySQL richtig Zahlen der Größe nach sortiert, aber ich kenne den richtigen Befehl nicht.
Bisher mach ich das mit "ORDER BY"
aber der Nachteil hier ist, daß folgendermassen sortiert wird.
Beispiel:
0812
122
235
445
Obwohl 0812 ja größer ist als 445
Kann mir bitte jemand den richtigen Befehl sagen.
Vielen Dank
Michael
Hi,
Ich würde gerne wissen wie man mit MySQL richtig Zahlen der Größe nach sortiert, aber ich kenne den richtigen Befehl nicht.
doch den kennst Du. Was Dir fehlt, ist der richtige Datentyp.
Obwohl 0812 ja größer ist als 445
Nein. Der _String_ "0812" ist kleiner als der _String_ "445".
Cheatah
Zunächst mal Danke.
Aber gibts da nicht vieleicht noch eine andere Möglichkeit?
Es handelt sich hier um Paragraphen,
und da gibt es eben auch solche, die eine Kombination aus
Zahlen und Buchstaben sind zB §0155c
yo,
Aber gibts da nicht vieleicht noch eine andere Möglichkeit?
ja, entweder alle inhalte zu einen bestimmten länge mit führenden nullen auffüllen oder aber alle führenden nullen abschneiden und dann über diese spalte sortieren.
Ilja
Auch Dir danke ich für den Tip,
aber mit Deiner Methode hast du das gleiche Problem nur um eine Ziffer verschoben.
zB.
1011
11
450
650
750
Vielleicht hat noch jemand ne Idee?
Vielen Dank
hi,
aber mit Deiner Methode hast du das gleiche Problem nur um eine Ziffer verschoben.
1011
11
450
650
750
das sind ja vermutlich auch immer noch strings, und immer noch keine zahlen!
also entweder machst du da einen CAST() drauf, um sie in eine zahl umzuwandeln - oder du addierst bspw. den wert 0, dann sollte mysql das m.E. auch als zahlwert betrachten.
gruß,
wahsaga
Leider funktionieren beide Vorschläge bei mir nicht.
Sowohl CAST als auch CONVERT können nur in folgende Typen
Konvertieren:
BINARY
CHAR
DATE
DATETIME
SIGNED
TIME
UNSIGNED
Der Trick eine Null zu addieren hat auch nicht geklappt
Trotzdem Danke
yo,
aber mit Deiner Methode hast du das gleiche Problem nur um eine Ziffer verschoben.
nein, du hast die methode nur nicht genau umgetzt. ich ergäzne mal deine beispielwerte, wie es aussehen könnte.
0011
0450
0650
0750
1011
und dann sollte er auch richtig sortieren...
Ilja
Leider nein, denn die Buchstaben machen mir einen Strich durch die Rechnung.
00114
00128
00255
02000
0255a
03000
:(
yo,
Leider nein, denn die Buchstaben machen mir einen Strich durch die Rechnung.
da kommen ja immer neue neuigkeiten ans licht. du solltest dir als erstes mal überlegen, wie deine daten aussehen (wertebereich) und uns dann mitteilen, wie du es sortiert haben willst. so geben wir dir lösungen und du kommst mit dem nächsten problemfall an. besser ist, du sagst alles von anfang an und dann finden wir schon eine lösung...
spontane idee von mir, ALLE nicht-zahlen-zeichen aus dem string rausnehmen und mit 0'len linksseitig auffüllen, bzw. zusatzanhänge wie 255a und 255b den letzten buchstaben extra sortieren lassen als zweites kriterium. dann klappt das eventuell auch mit dem nachbarn....
Ilja
da kommen ja immer neue neuigkeiten ans licht.
Tut mir leid, ich bin davon ausgegangen, daß du das mit den Paragraphen in dem Posting weiter oben von mir gelesen hattest...
Darf ich Dich trotzdem noch ein letztes mal nerven?
Also ich habe Paragraphen, die zB §0122c oder §155a oder §444 heißen;
Diese will ich geordnet aus einer Datenbank auslesen.
Das Paragraphzeichen selbst ist nicht mit in der Datenbank, das kommt später davorgeklebt.
spontane idee von mir, ALLE nicht-zahlen-zeichen aus dem string rausnehmen und mit 0'len linksseitig auffüllen, bzw. zusatzanhänge wie 255a und 255b den letzten buchstaben extra sortieren lassen als zweites kriterium.
Die Idee von Dir klingt sehr gut, nur leider hab ich keinen blassen Schimmer, wie dieser Höllen MySQL Befehl aussieht.
Könntest Du mir den Befehl noch sagen?
Vielen Dank :)
Michael
yo,
Also ich habe Paragraphen, die zB §0122c oder §155a oder §444 heißen;
Diese will ich geordnet aus einer Datenbank auslesen.
Das Paragraphzeichen selbst ist nicht mit in der Datenbank, das kommt später davorgeklebt.
mal von dem paragraphen abgesehen, empfiehlt es sich den zusatzbuchstaben am ende getrennt von der paragraphenzahl zu speichern, sprich eine extra spalte dafür. dann würde man über zwei spalten sortieren können.
und bei nur einer spalte sollte man enventuell ein konstante länge von charactern nehmen und immer mit führenden nullen auffüllen und das zusatzzeichen steht immer an der gleichen stelle. gefällt mir persönlich besser, als die nullen erst später hinzuzufügen für eine sortierung und das zusatzzeichen herauszufiltern.
egal, nenn uns doch mal deinen tabellennamen und die relevanten spaltennamen mit typ.
Ilja
Hallo Ilja,
vielen Dank für Deine Hilfe - ich mach PHP, MySQL erst seit kurzem und eben nur so nebenher.
dann würde man über zwei spalten sortieren können.
ORDER BY über mehrere Spalten weiß ich nich wie das geht.
egal, nenn uns doch mal deinen tabellennamen und die relevanten spaltennamen mit typ.
Hier der Query mit dem ich meine Tabelle erzeugt habe.
CREATE TABLE gesetze (id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,ueberschrift TEXT NOT NULL, paragraph VARCHAR(20) NOT NULL,text TEXT NOT NULL, FULLTEXT (ueberschrift,text))
Wie Du siehst sind meine bisherigen Kategorien:
id, ueberschrift, paragraph und text
Mein momentaner Suchbegriff lautet:
Select * FROM gesetze ORDER BY paragraph
Danke und Gruß Michi
yo Michi,
da bin ich wieder, hat ein wenig gedauert. nun aber zu dem lösungsweg. das erste, was man machen muss, herauszufinden, ob das letzte zeichen ein buchstabe ist oder nicht. da habe ich unter mysql keine funktion gefunden und es deswegen etwas umständlich über eine liste gemacht. vielleicht kann man das ja verbessern falls jemand eine funktion kennt. je nachdem ob es ein buchstabe ist oder nicht, wird das letzte zeichen abgeschitten und dann mit 0 zu einer konstanten länge aufgefüllt. folgende funktionen habe ich verwendet.
RIGHT(paragraph, 1) = letzte zeichen eines strings
SUBSTRING(paragraph,1,length(paragraph -1) = alle zeichen eines strings ausser das letzte zeichen
FIND_IN_SET(RIGHT(paragraph,1),'1,2,3,4,5,6,7,8,9,0') = überprüft ob das letzte zeichen eine ziffer ist
in der lösung habe ich die sortierung als spalten mit ausgegeben. das muss man nicht machen, sondern köntnte es in die ORDER BY klausel übernehmen, dient aber der besseren übersicht.
SELECT id, paragraph, LPAD(IF(FIND_IN_SET(RIGHT(paragraph,1),'1,2,3,4,5,6,7,8,9,0'), paragraph, SUBSTRING(paragraph,1,length(paragraph -1))),5,'0') AS Sort, RIGHT(paragraph, 1) as Last
FROM
gesetze
ORDER BY Sort, Last
grundsätzlich ist es aber anzuraten, die paragraphen-zahl und den suffix(buchstaben) in zwei spalten aufzuteilen. das würde vorteile bringen.
Ilja
Danke nochmals.
Werde mir Deine Befehle mit meinem MySQL Buch zu Gemüte führen,
damit ich kapier,was Du da machst. :)
Gruß Michi