2010-07-01 6 views
6

Come si ordina per numero se il proprio numero può scendere al di sotto e essere maggiore di 0?Mysql seleziona l'ordine agendo come una stringa, non un numero

tabella Esempio Mysql:

|Name|Karma| 
__________ 
|Me | -8 | 
|Bill| 5 | 
|Tom | 2 | 
|Saly| 0 | 
|San.| -3 | 

Esempio domanda prescelta

$sql="SELECT karma FROM table ORDER BY karma DESC"; 

Il risultato che ottengo è questo (separati da una virgola): 5,2,0, -8, -3. Non dovrebbe essere 5,2,0, -3, -8? Ho scoperto da qualche parte su Internet che mysql ordina per stringa. Come si fa ordinare per numero?

+1

Benvenuti a SO. Per favore, quando chiedi domande al database, specifica sempre quali tipi sono le colonne. –

risposta

17

Karma verrà ordinato come stringa se è stata creata una stringa, ad esempio una colonna varchar.

Convertire la colonna in un INT e ordinerà numericamente.

si ha anche la possibilità di non modificare la tabella, ma gettando la colonna nel giusto tipo, mentre l'ordinamento:

SELECT karma FROM table ORDER BY CAST(karma AS int) DESC 

ma che è male per le prestazioni.

+0

Hm, pensavo che varchar avrebbe fatto il trucco, ma mi sbagliavo. Grazie! – Aistis

+3

Il modo corretto è quello di memorizzare questo valore è un INT, non un VARCHAR, usato un valore firmato, in questo modo si possono fare negativi. Migliorerà le tue prestazioni e potrai aggiungere | substract alla colonna senza che il tuo codice PHP conosca il valore, che è un altro miglioramento delle prestazioni. – TravisO

14

C'è un'altra opzione più strana:

SELECT karma FROM table ORDER BY karma+0 DESC 
+0

Bello! Non sapevo che mySQL lo facesse. Eppure, è un cast implicito e non va bene per le prestazioni. –

+0

@ ne5tebio Hackable? Intendi dall'esterno? Io non la penso così Come funzionerebbe? –

+0

È più veloce di un casting su INT? – chiborg