2010-07-01 6 views
6

¿Cómo pides por número si tu número puede caer debajo y ser más grande que 0?Mysql selecciona la orden por actos como una cadena, no un número

mesa Ejemplo MySQL:

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

Ejemplo consulta de selección

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

El resultado que consigo es este (separados por comas): 5,2,0, -8, -3. ¿No debería ser 5,2,0, -3, -8? Descubrí en algún lugar de internet que mysql ordena por cadena. ¿Cómo hacerlo por número?

+1

Bienvenido a SO. Por favor, cuando haga preguntas a la base de datos, siempre especifique qué tipos son las columnas. –

Respuesta

17

Karma se ordenará como una cadena si la ha hecho una cadena, es decir, una columna varchar.

Convierta la columna a INT, y ordenará numéricamente.

También tienen la opción de no cambiar la mesa, pero echando la columna en el tipo correcto al ordenar:

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

pero lo que es malo para el rendimiento.

+0

Hm, pensé que varchar haría el truco, PERO estaba equivocado. ¡Gracias! – Aistis

+3

La forma correcta es almacenar este valor es un INT, no un VARCHAR, utilizó un valor con signo, de esa manera puede hacer negativos. Mejorará su rendimiento además de que puede agregar | restar a la columna sin su código PHP conociendo el valor, que es otra mejora en el rendimiento. – TravisO

14

Hay otra opción más rara:

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

¡Agradable! No sabía que mySQL hizo eso. Aún así, es un elenco implícito y no es bueno para el rendimiento. –

+0

@ ne5tebio Hackable? ¿Quieres decir desde afuera? No lo creo. ¿Cómo funcionaría eso? –

+0

¿Es esto más rápido que lanzar a un INT? – chiborg

Cuestiones relacionadas