Problema com a ordem do MySQL - Posso usar o Natsort para corrigi -lo?
Pergunta
Preciso usar a classificação natural com um resultado MySQL, pois atualmente classifica meus valores int da seguinte forma:
- 1
- 123
- 1256
- 22
- 231
etc
Enquanto eu precisaria disso para classificar como
- 1
- 22
- 231
- 1256
Conheço a função "Natsort", mas não funciona para um resultado da consulta MySQL. Como posso classificar (naturalmente), é possível fazer isso dentro da consulta?
Obrigado pela ajuda!
Editar: Exemplo de consulta $result = mysql_query("SELECT * FROM forums ORDER BY 'posts' DESC;");
Não tenho certeza se meu uso da DESC é válido, mas não lança um erro, por isso deve estar bem. Infelizmente, parece que mudar o DESC para ASC também não tem efeito ...
Solução
A consulta que você postou é classificada por uma expressão constante de string, em vez de um nome ou posição da coluna. Use backsticks para citar ou retire as cotações:
SELECT * FROM forums ORDER BY `posts` DESC
ou talvez
SELECT * FROM forums ORDER BY posts DESC
Explicaria por que mudar entre ASC e DESC não tem efeito.
A resposta inicial foi:
A ordem de classificação que você descreve sugere que os valores int estão realmente sendo armazenados como um tipo de caractere (ou talvez convertidos em caracteres antes de classificar).
Verifique se você está armazenando os dados em um tipo numérico ou de caractere. Se possível, use um tipo numérico, a ordem de classificação natural será necessária. Se você não pode Altere o tipo de dados subjacente a ser int, então você pode fazer isso em sua consulta (por exemplo, usando ELENCO), provavelmente ao custo do desempenho.
Outras dicas
Se as postagens fossem uma coluna não-INT, você poderia tentar o seguinte:
SELECT * FROM forums ORDER BY CAST(`posts` AS INT) DESC
Também dê uma olhada em http://drupal.org/project/natsort. Este é um módulo Drupal que pode ser usado para facilitar a classificação MySQL.
Essa questão Tem uma resposta para o MySQL que eu usei.