Problema con MySQL ORDER BY - puedo usar natsort para solucionarlo?
Pregunta
necesito utilizar la clasificación natural con un resultado de MySQL, ya que actualmente ordena mis valores INT de la siguiente manera:
- 1
- 123
- 1256
- 22
- 231
[etc.]
Mientras que lo necesitaría para ordenar como
- 1
- 22
- 231
- 1256
No conozco la función "natsort", pero no funciona para un resultado de la consulta MySQL. ¿Cómo puedo ordenar (naturalmente), ¿es posible hacer esto dentro de la consulta?
Gracias por la ayuda!
EDIT: Ejemplo consulta $result = mysql_query("SELECT * FROM forums ORDER BY 'posts' DESC;");
No sabe con certeza si mi uso de DESC no es válida, pero no arroja un error por lo que debe estar bien. Por desgracia, parece cambiar a DESC ASC también tiene ningún efecto ...
Solución
La consulta que has enviado no está clasificando por una expresión constante de cadena, en lugar de un nombre de columna o posición. Cualquiera de acentos abiertos de uso para citar, o para llevar las comillas:
SELECT * FROM forums ORDER BY `posts` DESC
o tal vez
SELECT * FROM forums ORDER BY posts DESC
explicaría por qué el cambio entre ASC y DESC no tiene ningún efecto.
respuesta inicial fue:
El orden de clasificación que describes sugiere los valores INT se están almacenando en realidad como un tipo de carácter (o tal vez convertidos a caracteres antes de la clasificación).
Compruebe si se está almacenando los datos en un tipo numérico o carácter. Si es posible utilizar un tipo numérico, entonces el orden natural será como sea necesario. Si no puede cambia el tipo de datos subyacente para ser INT, entonces usted puede hacer esto en su consulta (por ejemplo, usando Reparto ), probablemente a costa del rendimiento.
Otros consejos
Si los mensajes era una columna no INT, podría intentar esto:
SELECT * FROM forums ORDER BY CAST(`posts` AS INT) DESC
También echar un vistazo a http://drupal.org/project/natsort . Este es un módulo de Drupal que puede ser utilizado para facilitar MySQL clasificación.
Esta pregunta tiene una respuesta para MySQL que he utilizado.