PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ORDER BY numerisch, trotz VARCHAR?


c4
17.02.2004, 21:20:47
Moin,

laut allmöglichen Foren und ähnlichen Etwasen geht es nicht, aber vielleicht wisst ihr es besser:
Wie kann ich mit MySQL einen String numerisch sortieren lassen? In der DB stehen mehrere Datensätze und ausgegeben sieht es momentan so aus:
Klasse 1
Klasse 10
Klasse 11
Klasse 12
Klasse 13
Klasse 2
Klasse 3
Das ist natürlich Mist. Hat wer eine DB-basierte Idee?

Erst auslesen und dann PHP-eigenen Funktionen sortieren wäre meine einzige Idee, aber es wäre nicht schön.


Dank euch,
Carsten

chris17
17.02.2004, 22:33:42
Hi Carsten,

eine Idee, bei der mit "... + 0" ein Zahlentyp "erzwungen" wird, es sollte halt ab der 8. Stelle im String die Ziffern kommen...

SELECT (SUBSTRING(klassen_spalte,8,2) + 0) AS gugug FROM tabelle ORDER BY gugug

Weiss net, ob das schön ist, funktionieren tut's :-)

c4
18.02.2004, 07:56:12
Gute Idee, nur ist diese auch ausgeschlossen, da in der Tabelle auch Dinge, wie 'Grundstufe', 'Sekundarstufe I' und so stehen...

chris17
18.02.2004, 14:02:55
Es stehen also die konkreten Klassen 1-13 und/oder Sekundarstufe etc. in der gleichen Spalte drin?!
Die "Stufen", Grundstufe, Sekundarstufe etc. resultieren doch aus den Klassenzahlen 5-13, oder net?.(Ist bei mir schon etwas länger her...)
Wäre schön, wenn nur die Klasse drinstehen würde, und man dann im Skript die entsprechende Stufe ermitteln würde...

Macht aber nix, eine Möglichkeit wäre noch eine benutzerdefinierte Reihenfolge mit FIELD() festzulegen:
SELECT FIELD(klassen_spalte, 'Klasse 1','Klasse 2','Klasse 3', 'usw..','Sekundarstufe I') AS index,
FROM
tabelle
ORDER BY
index



Nachtrag zu meinem vorherigen Thread:
Mit RIGHT() ging's auch einfacher...

SELECT (RIGHT(klassen_spalte ,2)) AS gugug FROM tabelle ORDER BY gugug

c4
18.02.2004, 14:10:51
Die genannten und noch andere Datensätze sind so gewünscht, also bekommt er diese auch. Der Auftraggeber will Dynamik, also bekommt er sie auch. Lässt sich ja nix dran ändern.

Macht aber nix, eine Möglichkeit wäre noch eine benutzerdefinierte Reihenfolge mit FIELD() festzulegen Wie soll das bei dynamischem Inhalt gehen...?


Gute Ideen hast du ja, aber um natsort() komme ich dann wohl doch nicht herum.

Fuchs
18.02.2004, 17:35:02
Ungetestet, duerfte aber funktionieren:

ORDER BY CAST(SUBSTRING_INDEX(RTRIM(field), ' ', -1) AS SIGNED INTEGER)

c4
18.02.2004, 17:38:56
Meine Fresse, Andre! Das funzt hervorragend.
Werde mich doch noch mal mit CAST beschäftigen müssen. War eigentlich der Meinung, dass das nicht hilft...


Danke euch.




Edit: Doch nicht ganz perfekt:
Grundstufe
Vorschulbereich
Sekundarstufe I
Sekundarstufe II
Klasse 1
Klasse 2
Klasse 3
Klasse 4
Klasse 5
Klasse 6
Klasse 7
Klasse 8
Klasse 9
Klasse 10
Klasse 12
Klasse 13
Verbesserungsvorschlag? Doppelte Sortierung? Also erste und letzte Zeichen oder so?

Fuchs
18.02.2004, 22:46:24
Ungetestet aber die richtung duerfte stimmen:


order by
left(field, length(filed)-length(substring_index(field, ' ', -1))), cast(substring_index(field, ' ', -1) as unsigned integer);

HTH Andre

c4
19.02.2004, 07:56:09
Ja, es wird...
Grundstufe
Vorschulbereich
Klasse 1
Klasse 2
Klasse 3
Klasse 4
Klasse 5
Klasse 6
Klasse 7
Klasse 8
Klasse 9
Klasse 10
Klasse 12
Klasse 13
Sekundarstufe I
Sekundarstufe II

nrsdesign
02.02.2006, 17:16:24
Hallo,

sorry, wenn ich diesen alten Thread nochmal erfrische...

Wie kann ich denn nach 2 Spalten (Typ VarChar) sortieren ?

D.H. ich habe eine spalte row1 = VARCHAR und eine row2 = VARCHAR.

Jetzt möchte ich, dass Mysql erst nach spalte row1 und dann nach spalte row2 sortiert.

Ist das möglich ?

Vielen Dank

vt1816
02.02.2006, 18:20:09
Hallo,

sorry, wenn ich diesen alten Thread nochmal erfrische...

Wie kann ich denn nach 2 Spalten (Typ VarChar) sortieren ?

D.H. ich habe eine spalte row1 = VARCHAR und eine row2 = VARCHAR.

Jetzt möchte ich, dass Mysql erst nach spalte row1 und dann nach spalte row2 sortiert.

Ist das möglich ?

Vielen DankSELECT ... FROM ... WHERE ... ORDER BY Bedingung 1, Bedingung 2 ... und guckst Du hier (http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html).