Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

algo raro al ordenar :S

Estas en el tema de algo raro al ordenar :S en el foro de Mysql en Foros del Web. hola tengo php5 y mysql5 y en si no tengo ningun error, pero cuando hago un select y doy order by me muestra la información ...
  #1 (permalink)  
Antiguo 19/12/2008, 14:57
Avatar de Mcruzmx  
Fecha de Ingreso: abril-2006
Mensajes: 357
Antigüedad: 18 años
Puntos: 9
algo raro al ordenar :S

hola tengo php5 y mysql5

y en si no tengo ningun error, pero cuando hago un select y doy order by me muestra la información un poco raro. aqui esta el codigo:

Código:
SELECT * FROM $tablex Order by folio DESC
los folios son del tipo SA/año.mes.numeroconsecutivo

por ejemplo: SA/08.12.48

existen consecutivos del 2 al 100 o asi sucesivamente, y lo raro es que hace algo asi

99
98
.
.
5
3
2
100


entonces, por ke me toma el 100 hasta abajo? deberia de ponerlo arriba del 99 que no?

gracias.
  #2 (permalink)  
Antiguo 19/12/2008, 15:13
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: algo raro al ordenar :S

El problema es que ordena folio como lo que es, una cadena de texto, y las cadenas de texto se ordenan carácter a carácter, de izquierda a derecha; y el 1 de 100 lo sitúa al final si lo ordenamos en orden descendente.

Si quieres ordenar como dices, y los meses están introducidos con el 0 por delante cuando son números de meses inferiores a 10, usa esta consulta para ordenar:
Código sql:
Ver original
  1. SELECT folio
  2. FROM tablex
  3. ORDER BY substring_index( folio, '.', 2 ) , CAST( substring_index( folio, '.', -1 ) AS UNSIGNED )

Pon ASC o DESC, según te interese, pero piensa cómo lo haces, pues podrías ordenar ascendente la primera parte y descendente la segunda...
  #3 (permalink)  
Antiguo 20/12/2008, 21:36
Avatar de Mcruzmx  
Fecha de Ingreso: abril-2006
Mensajes: 357
Antigüedad: 18 años
Puntos: 9
Respuesta: algo raro al ordenar :S

changos gracias por la ayuda pero me gustaria entender un poco lo que pones pues no entiendo lo que hace, me podrias explicar por favor? gracias.
  #4 (permalink)  
Antiguo 21/12/2008, 01:47
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: algo raro al ordenar :S

claro que puedo explicarlo:
Tú tienes entre otros valores para el campo folio SA/08.02.48

y se trata, claro está, de un campo VARCHAR o CHAR.

En la consulta

Código sql:
Ver original
  1. SELECT folio
  2. FROM tablex
  3. ORDER BY substring_index( folio, '.', 2 ) , CAST( substring_index( folio, '.', -1 ) AS UNSIGNED )

selecciono el campo de tu tabla (SELECT folio FROM tablex), pero a la hora de ordenar lo hago por dos criterios (ORDER BY...).
La función SUBSTRING_INDEX separa la cadena con un delimitador, en este caso pensé que mejor el punto, que aparece en tu cadena dos veces (antes del mes y después del mes). El SUBSTRING (folio,'.',2) me saca una cadena de folio hasta el segundo punto (número positivo de izquierda a derecha), y ordena por orden alfabético esa parte (se trata, no lo olvides, de cadena de texto); luego hago lo mismo para que me ordene por el resto, pero en este caso, le digo que la parte de la cadena es desde el final (yendo hacia atrás) hasta el primer punto (substring_index( folio, '.', -1 ) , pues esa parte es la que te interesa ordenar no como cadena de texto, sino como número. Una vez separada, es necesario convertir esa parte a número, y para eso contamos en MySQL con la función CAST... AS UNSIGNED. De modo que CAST( SUBSTRING_INDEX( folio, '.', -1 ) AS UNSIGNED ) te separa la parte final de la cadena, desde el último punto hacia adelante, y la convierte en número positivo UNSIGNED (todos son números positivos). Finalmente, pedimos que ordene todo usando como primer criterio de ordenación la primera parte y, como segundo, la segunda, con lo que la ordenamos por toda la cadena, pero con criterios distintos: la primera parte la ordena como cadena de texto y la segunda como lo que es ahora, tras pasar por la función CAST, un número.

Sería algo parecido a si tuvieras la cadena separada en dos campos, uno llamado primeraparte, donde tendrías SA/08.02, y otro llamado segundaparte, donde tendrías el 48, y el primeraparte fuera de tipo VARCHAR y segundaparte de tipo INT. Si fuera así y ordenaras con esta sintaxis
SELECT * FROM tablex ORDER BY primeraparte, segundaparte
estaríamos haciendo lo mismo por lo que se refiere al orden.

Espero haberme explicado bien.

Saludos


Echa un vistazo a SUBSTRING_INDEX
http://dev.mysql.com/doc/refman/5.0/...ubstring-index

y a CAST()
http://dev.mysql.com/doc/refman/5.0/...functions.html

Última edición por jurena; 22/12/2008 a las 05:47
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:09.