webForumDet fria alternativet

Sortering av id blir fel

5 svar · 251 visningar · startad av Elric

ElricMedlem sedan jan. 200246 inlägg
#1

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?

LarsGMedlem sedan dec. 200012 464 inlägg
#2

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.

ElricMedlem sedan jan. 200246 inlägg
#3

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?

LarsGMedlem sedan dec. 200012 464 inlägg
#4

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.

ElricMedlem sedan jan. 200246 inlägg
#5

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.

ElricMedlem sedan jan. 200246 inlägg
#6

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
134 ms totalt · 3 externa anrop · v20260731065814-full.86db40fa
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)