Classificação natural no MySQL

AVISO LEGAL: Se isso já foi postado, sinto muito, mas como não temos um recurso de ‘pesquisa’ para mensagens, prefiro fazer uma nova postagem do que manter isso longe de vocês, pessoal 🙂

Então, eu estava mexendo em algumas tabelas neste fim de semana e precisava classificar uma consulta usando a seleção natural.

Vamos supor que temos a seguinte coleção de dados

Dados de amostra

Então, vamos ao MySQL e executamos a seguinte consulta

SELECT * FROM testdata ORDER BY name</code>

O resultado são os dados classificados como string:

Dados mal classificados

Para evitar esse problema, podemos pedir ao MySQL para classificar os dados por LENGTH primeiro e eles por nome, assim:

SELECT * FROM testdata ORDER BY LENGHT(name), name </code>

Ótimo! Agora funciona. O céu está azul novamente.

Dados classificados corretamente

Vamos inverter a ordem e … Merda. Se você precisar inverter a ordem, e você executou
SELECT * FROM testdata ORDER BY LENGHT(name), name DESC</code> you'd be surprised with the following result

Dados classificados não tão corretamente

Mas, mais uma vez, isso é fácil de resolver; Apenas certifique-se de passar o argumento DESC para ambos os filtros ORDER BY, como este

SELECT * FROM testdata ORDER BY LENGHT(name) DESC, name DESC</code>

E aí está.

Finalmente, dados classificados corretamente!