Det är korrekt sortering för ett karaktärsfält.
Om du vill sortera enligt det numeriska värdet så får du byta datatyp till decimal eller float.
5 svar · 253 visningar · startad av Elric
Jag försöker sortera några id-värden som ser ut så här: 1.1, 1.2, 1.3 osv. När jag använder denna förfrågan:
$result = mysql_query("SELECT * FROM tabell WHERE något = '$något' ORDER BY id",$db)
så sorteras dom så här: 1.1, 1.10, 1.11, 1.2, 1.3 osv, men jag vill att dom skall sorteras så här: 1.1, 1.2, 1.3 ... 1.10, 1.11, 1.12 osv
Tabellfältet som jag använder är VARCHAR. Går detta inte att göra med ORDER BY och VARCHAR?
Det är korrekt sortering för ett karaktärsfält.
Om du vill sortera enligt det numeriska värdet så får du byta datatyp till decimal eller float.
Men det går alltså inte att sortera ett VARCHAR-fält på det viset som jag vill?
Jag kan inte gå över till INT,FLOAT eller DECIMAL eftersom att jag har en punkt i värdet, eller går det att göra?
Punkt används som decimalavgränsare i SQL så det går ju att lagra som decimal. Om du inte vill byta datatyp så kan du ju försöka att konvertera värdet till decimal. Normalt sett så skulle man använda cast men mysql har (som vanligt) ett begränsat stöd för det och det finns inget sätt att explicit konvertera något till decimal enligt dokumentationen. Det är möjligt att det går med något som detta
select * from t order by id + 0.0
Jag vet inte om det fungerar men Mysql verkar ha en (i negativ bemärkelse) flexibel hantering av implicita typkonverteringar.
Om du har värden som kan innehålla flera punkter (t.ex. kapitelnummer) så är det inte så lätt. En möjlighet är att ha ett extra fält som anger sorteringsordningen.
Ok tack ska du ha
Jag har märkt att om jag skriver numren så här: 1.01, 1.02, 1.03 ... 1.10, 1.11, så sorteras dom rätt eller så går jag över till id# utan punkt. Får se hur jag gör.
Jag fick tag på en lösning på ett annat ställe, kanske är någon som har nytta ut av det:
ORDER BY left(id, locate('.', id) -1) + 0, substring(id,(locate('.', id) + 1)) + 0