Script MySQL - problema na ordenação [RESOLVIDO]

3 respostas
E

Pessoal, estou com o seguinte problema, eu tenho uma tabela no banco (MySQL) com uma coluna de código, onde por exemplo, existem os dados:

CODIGO
12-32-2
111-432-2
23-434-5

Quando eu faço um select e ordeno esses dados, SELECT * FROM nomeDaTabela order by CODIGO ele não ordena corretamente, ele pega somente os numeros antes da ’ - '. Esse campo é um varchar. Alguém pode me dar uma ajuda para ordenar por codigo más considerado ele inteiro e não somente até o traço?

3 Respostas

D

Sim, ele está ordenando corretamente.
Já viu a tabela ASCII?
Nela está a explicação para tal comportamento:
0 < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9
Porém,

  • < 0
    Ou seja, quando o MySQL engine acha dois valores
    100-1 e 1000 ele vai colocar o 100-1 antes do 1000.
    Qual o problema?
    Agora, se ele encontra
    100-1 e 100-0 e coloca o 100-1 antes, aí sim o comportamento está errado.

Fonte: http://www.tudolink.com/tabela-ascii-estendida-completa/

W

drsmachado:
Sim, ele está ordenando corretamente.
Já viu a tabela ASCII?
Nela está a explicação para tal comportamento:
0 < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9
Porém,

  • < 0
    Ou seja, quando o MySQL engine acha dois valores
    100-1 e 1000 ele vai colocar o 100-1 antes do 1000.
    Qual o problema?
    Agora, se ele encontra
    100-1 e 100-0 e coloca o 100-1 antes, aí sim o comportamento está errado.

Fonte: http://www.tudolink.com/tabela-ascii-estendida-completa/

++

tenta isso aqui, to sem BD para fazer testes:

SELECT * FROM nome_da_tabela ORDER BY CAST(SUBSTRING(codigo, 1, LOCATE('-', codigo)-1) AS UNSIGNED)

para entender mais ou menos o que eu fiz, eu fiz um mix dessas funções: http://dev.mysql.com/doc/refman/5.5/en/string-functions.html

[]'s

E

WRYEL:
drsmachado:
Sim, ele está ordenando corretamente.
Já viu a tabela ASCII?
Nela está a explicação para tal comportamento:
0 < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9
Porém,

  • < 0
    Ou seja, quando o MySQL engine acha dois valores
    100-1 e 1000 ele vai colocar o 100-1 antes do 1000.
    Qual o problema?
    Agora, se ele encontra
    100-1 e 100-0 e coloca o 100-1 antes, aí sim o comportamento está errado.

Fonte: http://www.tudolink.com/tabela-ascii-estendida-completa/

++

tenta isso aqui, to sem BD para fazer testes:

SELECT * FROM nome_da_tabela ORDER BY CAST(SUBSTRING(codigo, 1, LOCATE('-', codigo)-1) AS UNSIGNED)

para entender mais ou menos o que eu fiz, eu fiz um mix dessas funções: http://dev.mysql.com/doc/refman/5.5/en/string-functions.html

[]'s

Beleza WRYEL, era isso mesmo, obrigado pela dica!

Criado 14 de junho de 2012
Ultima resposta 14 de jun. de 2012
Respostas 3
Participantes 3