Ordenando por campos compostos no MySQL

Hoje me deparei com uma situação meio que inusitada: fui obrigado a ordenar uma tabela por código de produtos.

Até aí tudo normal, se não fossem os códigos algo como ‘CT 70’, ‘CT 100’, ‘CT 40’, ‘LG 90’, e por aí vai. O problema é que se eu faço um SELECT * ORDER BY codigo ele retorna a seqüência anterior assim: ‘CT 100’, ‘CT 40’, ‘CT 70’, ‘LG 90′. Como se pode observar o’ CT 100′ vem antes do ‘CT 40’ e ‘CT 70’, já que para o MySQL está fazendo uma ordenação por string.

Assim sendo, o que fazer? Bem, felizmente o MySQL tem a função substring-index, que permite que a gente quebre uma string usando um delimit. Assim, para ordenar de forma correta temos: SELECT * ORDER BY SUBSTRING_INDEX(codigo, ‘ ‘, 1) ASC, SUBSTRING_INDEX(codigo, ‘ ‘, -1) +0 ASC. Por que o select é duplo? Um para ordenar primeiramente pelos caracteres iniciais (sem ele nosso exemplo ficaria  ‘CT 40’, ‘CT 70′,’LG 90’, ‘CT 100’) e o segundo para ordenar de forma numérica (a conversão se dá graças ao + 0 acrescentado após a função). Com isso obtemos a ordem correta: ‘CT 40’, ‘CT 70’, ‘CT 100’, ‘LT 90’.

E obrigado ao Paulo Cazarotto pela ajuda 🙂 Nunca que eu ia pensar em somar zero para converter de string para numérico… 😀