Ver Mensaje Individual
  #4 (permalink)  
Antiguo 21/12/2008, 01:47
jurena
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