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

ordenar bien en mysql

Estas en el tema de ordenar bien en mysql en el foro de Mysql en Foros del Web. Hola amigos. He visto otro tema en el foro que explicais que para que se ordenen los numeros en mysql se guardan como TINYINT y ...
  #1 (permalink)  
Antiguo 15/10/2008, 08:57
Avatar de frasko01  
Fecha de Ingreso: junio-2008
Mensajes: 200
Antigüedad: 15 años, 10 meses
Puntos: 3
Pregunta ordenar bien en mysql

Hola amigos.

He visto otro tema en el foro que explicais que para que se ordenen los numeros en mysql se guardan como TINYINT y solucionado, pero... yo necesito ordenar un varchar que tiene algo así:

I.1.1
I.1.10
I.1.2...........

Y no le puedo poner un cero delante a cada uno, no queda nada bien.

Muchas gracias. Un saludo.
  #2 (permalink)  
Antiguo 15/10/2008, 09:18
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: ordenar bien en mysql

Tema trasladado a MySQL.
  #3 (permalink)  
Antiguo 15/10/2008, 22:04
 
Fecha de Ingreso: diciembre-2007
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: ordenar bien en mysql

Cita:
Iniciado por frasko01 Ver Mensaje
Hola amigos.

He visto otro tema en el foro que explicais que para que se ordenen los numeros en mysql se guardan como TINYINT y solucionado, pero... yo necesito ordenar un varchar que tiene algo así:

I.1.1
I.1.10
I.1.2...........

Y no le puedo poner un cero delante a cada uno, no queda nada bien.

Muchas gracias. Un saludo.
Puedes intentar esto:

select campo from prueba
order by SUBSTRING_INDEX(campo, '.', 1), /* aqui ordenas los numero romanos */
cast(SUBSTRING_INDEX(SUBSTRING_INDEX(campo, '.', -2),'.',1) as decimal), /* extraemos los numeros del segundo nivel y los converitmos en numeros */
cast(SUBSTRING_INDEX(campo, '.', -1) as decimal) /* extraemos los numero del tercer nivel y los convertimos en numero */

Salu2,

Última edición por K-SuMa; 15/10/2008 a las 22:57
  #4 (permalink)  
Antiguo 15/10/2008, 23:24
 
Fecha de Ingreso: diciembre-2007
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: ordenar bien en mysql

Estimado frasko01, me di cuenta q hay un error en la consulta y es q el primer nivel son numeros romanos y esa vaina estoy viendo como lo puedo arreglar pero por el momento esto funciona hasta el 8 en romano (VIII). Si encuentras la solucion a ordenar numeros romanos pf la publicas.

Cita:
Iniciado por K-SuMa Ver Mensaje
Puedes intentar esto:

select campo from prueba
order by SUBSTRING_INDEX(campo, '.', 1), /* aqui ordenas los numero romanos */
cast(SUBSTRING_INDEX(SUBSTRING_INDEX(campo, '.', -2),'.',1) as decimal), /* extraemos los numeros del segundo nivel y los converitmos en numeros */
cast(SUBSTRING_INDEX(campo, '.', -1) as decimal) /* extraemos los numero del tercer nivel y los convertimos en numero */

Salu2,
Salu2,
  #5 (permalink)  
Antiguo 16/10/2008, 01:04
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: ordenar bien en mysql

K-SUMA te ha aconsejado bien. Para los números romanos, yo te aconsejaría tratar de aprovechar el orden alfabético .
Con esta consulta ordenarás hasta tres separaciones con puntos de un campotexto, es decir, lo que tienes. Prueba y dinos. Te alcanza en números romanos hasta miles, siempre que los pongas con varias M.

Código sql:
Ver original
  1. SELECT campotexto
  2. FROM `tabla`
  3. ORDER BY REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( SUBSTRING_INDEX( campotexto, '.', 1 ) , 'CM', 'ZZZZ' ) , 'M', 'ZZZZZ' ) , 'CD', 'YYYY' ) , 'D', 'YYYYY' ) , 'XC', 'XXXXXXXXX' ) , 'C', 'XXXXXXXXXX' ) , 'XL', 'XXXX' ) , 'L', 'XXXXX' ) , 'IX', 'VIIII' ) , 'X', 'VIIIII' ) , CAST( SUBSTRING_INDEX( campotexto, '.', 2 ) AS UNSIGNED ) , CAST( SUBSTRING_INDEX( campotexto, '.', 3 ) AS UNSIGNED )

Última edición por jurena; 17/10/2008 a las 12:14
  #6 (permalink)  
Antiguo 16/10/2008, 01:31
Avatar de frasko01  
Fecha de Ingreso: junio-2008
Mensajes: 200
Antigüedad: 15 años, 10 meses
Puntos: 3
Respuesta: ordenar bien en mysql

Gracias K-suma y jurena
jurena, tu código me da error, y k-suma el tuyo me ordena de la siguiente manera:

I
I.1
I.2
I.3
I.1.1
I.1.2

Necesitaría que se ordenaran así:

I
I.1
I.1.1
I.1.2
I.1.2.1
I.1.3
I.2

Espero que no sea mucho pedir ;)

Saludos
  #7 (permalink)  
Antiguo 16/10/2008, 02:54
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: ordenar bien en mysql

frasko01,
dinos qué error te da mi consulta, pues la probé y funcionaba perfectamente en MySQL 5. Tal vez al corregir para presentarla más elegante, cambié algo o dejé algo mal, pero te aseguro que ordenaba todo, aunque, claro, tendrás que sustituir el nombre de tabla por el de tu tabla y el de campotexto por el nombre de campo en el que tengas el dato, y eso todas las veces que aparezca. Prueba a hacer esos cambios, y dinos qué error te lanza para que hagamos las correcciones.
  #8 (permalink)  
Antiguo 16/10/2008, 03:19
Avatar de frasko01  
Fecha de Ingreso: junio-2008
Mensajes: 200
Antigüedad: 15 años, 10 meses
Puntos: 3
Respuesta: ordenar bien en mysql

No no, perdona jurena, no me da error pero me los ordena mal:

I.1
I.10
I.2
  #9 (permalink)  
Antiguo 16/10/2008, 04:25
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: ordenar bien en mysql

perdona, frasko01,
he estado algo descuidado. Lo de los números romanos funciona bien, pero para lo otro, para los números arábigos necesito saber cuál es el mayor número de espacios entre puntos.
I.1.2.3.4
esto serían 5 espacios. Dímelo y lo solucionaremos. Por otra parte, el problema del cast se soluciona haciéndolo con posterioridad
cast(substring_index(campo,'.', [este número es el que tengo que corregir dependiendo de tus datos]) as UNSIGNED

Luego funcionará, no te preocupes. Si me proporcionas esa información, tal vez esta tarde pueda prepararte la consulta que solucione tu problema
  #10 (permalink)  
Antiguo 16/10/2008, 04:34
Avatar de frasko01  
Fecha de Ingreso: junio-2008
Mensajes: 200
Antigüedad: 15 años, 10 meses
Puntos: 3
Respuesta: ordenar bien en mysql

Solo puede haber cuatro espacios, pero en cada uno puede haber más de un caracter:

I.1.10.1
II.3.5.10
III.10.2.7

Gracias.
  #11 (permalink)  
Antiguo 16/10/2008, 07:39
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: ordenar bien en mysql

Prueba así:
Código sql:
Ver original
  1. SELECT campotexto
  2. FROM `tabla`
  3. ORDER BY REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( SUBSTRING_INDEX( campotexto, '.', 1 ) , 'CM', 'ZZZZ' ) , 'M', 'ZZZZZ' ) , 'CD', 'YYYY' ) , 'D', 'YYYYY' ) , 'XC', 'XXXXXXXXX' ) , 'C', 'XXXXXXXXXX' ) , 'XL', 'XXXX' ) , 'L', 'XXXXX' ) , 'IX', 'VIIII' ) , 'X', 'VIIIII' ) , CAST(SUBSTRING_INDEX( SUBSTRING_INDEX( campotexto, '.', 2 ),'.',-1) AS UNSIGNED ) , CAST( SUBSTRING_INDEX(SUBSTRING_INDEX( campotexto, '.', 3 ),'.',-1) AS UNSIGNED ), CAST(SUBSTRING_INDEX( SUBSTRING_INDEX( campotexto, '.', 4 ),'.',-1) AS UNSIGNED )

Como ves, he hecho una mezcla entre la propuesta de K-SUMA y la mía sobre los números romanos.
  #12 (permalink)  
Antiguo 16/10/2008, 08:10
Avatar de frasko01  
Fecha de Ingreso: junio-2008
Mensajes: 200
Antigüedad: 15 años, 10 meses
Puntos: 3
Respuesta: ordenar bien en mysql

Casi...

Asi me los ordena ahora:

I.2.1
I.2
I.2.2
I.2.3
I.2.4.1
I.2.4.2
I.2.4

Venga, que estamos cerca
Saludos
  #13 (permalink)  
Antiguo 16/10/2008, 10:40
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: ordenar bien en mysql

Perdona, frasko01,
soy un hombre de letras y se me atragantan los numeritos:
así:
Código sql:
Ver original
  1. SELECT campotexto
  2. FROM `tabla`
  3. ORDER BY REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( SUBSTRING_INDEX( campotexto, '.', 1 ) , 'CM', 'ZZZZ' ) , 'M', 'ZZZZZ' ) , 'CD', 'YYYY' ) , 'D', 'YYYYY' ) , 'XC', 'XXXXXXXXX' ) , 'C', 'XXXXXXXXXX' ) , 'XL', 'XXXX' ) , 'L', 'XXXXX' ) , 'IX', 'VIIII' ) , 'X', 'VIIIII' ) , CAST(SUBSTRING_INDEX( SUBSTRING_INDEX( campotexto, '.', 2 ),'.',-1) AS UNSIGNED ) , CAST( SUBSTRING_INDEX(SUBSTRING_INDEX( campotexto, '.', 3 ),'.',-2) AS UNSIGNED ), CAST(SUBSTRING_INDEX( SUBSTRING_INDEX( campotexto, '.', 4 ),'.',-3) AS UNSIGNED )

Postdata: esta vez lo he comprobado con más detalle.
  #14 (permalink)  
Antiguo 16/10/2008, 11:03
Avatar de frasko01  
Fecha de Ingreso: junio-2008
Mensajes: 200
Antigüedad: 15 años, 10 meses
Puntos: 3
Respuesta: ordenar bien en mysql

Estamos cerca pero aún no.

Me ordena como en el primer post:

I.1.1
I.1.10
I.1.2...........

Gracias de todas formas
  #15 (permalink)  
Antiguo 16/10/2008, 11:33
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: ordenar bien en mysql

Se había complicado, pero observé que el problema era el último espacio, que al quedar sin cerrar, causaba problemas. Ahora he hecho un concat para cerrar toda la cadena con punto y rectificado los datos de los substring_index dentro de los substring_index.
Aunque lo creo, ahora no me atrevo a decir que esta es la 'refinitiva'
Código sql:
Ver original
  1. SELECT campotexto FROM `tabla`
  2. ORDER BY REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( SUBSTRING_INDEX( concat( campotexto, '.' ) , '.', 1 ) , 'CM', 'ZZZZ' ) , 'M', 'ZZZZZ' ) , 'CD', 'YYYY' ) , 'D', 'YYYYY' ) , 'XC', 'XXXXXXXXX' ) , 'C', 'XXXXXXXXXX' ) , 'XL', 'XXXX' ) , 'L', 'XXXXX' ) , 'IX', 'VIIII' ) , 'X', 'VIIIII' ), CAST( SUBSTRING_INDEX( SUBSTRING_INDEX( concat( campotexto, '.' ) , '.', 2 ) , '.', -1 ) AS UNSIGNED ), CAST( SUBSTRING_INDEX( SUBSTRING_INDEX( concat( campotexto, '.' ) , '.', 3 ) , '.', -1 ) AS UNSIGNED ), CAST( SUBSTRING_INDEX( SUBSTRING_INDEX( concat( campotexto, '.' ) , '.', 4 ) , '.', -1 ) AS UNSIGNED )
  #16 (permalink)  
Antiguo 16/10/2008, 12:01
Avatar de frasko01  
Fecha de Ingreso: junio-2008
Mensajes: 200
Antigüedad: 15 años, 10 meses
Puntos: 3
Respuesta: ordenar bien en mysql

Muchas gracias por tu ayuda, se nota que le has puesto mucho empeño.

Ya no puedo probarlo hasta mañana que vuelva al kurro mañana te contaré.

De nuevo, muchas gracias. Saludos
  #17 (permalink)  
Antiguo 17/10/2008, 01:11
Avatar de frasko01  
Fecha de Ingreso: junio-2008
Mensajes: 200
Antigüedad: 15 años, 10 meses
Puntos: 3
Respuesta: ordenar bien en mysql

Muy bien. Esa era la solución.

Gracias jurena. Saludos.
  #18 (permalink)  
Antiguo 17/10/2008, 03:07
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: ordenar bien en mysql

frasko01,

ha costado un poco, pero ya lo tenemos. No obstante, te diré que algunas de estas cosas también pueden solucionarse con programación, cargando en un array los datos mediante explode y luego ordenando por varios campos, convirtiendo mediante una función los números romanos en arábigos (las hay en la red), etc.; aunque esto sería tema para otro foro.

Saludos.

Última edición por jurena; 17/10/2008 a las 07:10
  #19 (permalink)  
Antiguo 17/10/2008, 10:13
Avatar de frasko01  
Fecha de Ingreso: junio-2008
Mensajes: 200
Antigüedad: 15 años, 10 meses
Puntos: 3
Respuesta: ordenar bien en mysql

En realidad me interesaba mas ordenar los números arábigos ya que los números romanos no van a llegar a los miles, creo que es posible que no lleguen ni a los cien, pero da igual, ya que ha salido se va a quedar así.

Gracias por tu ayuda. Saludos.
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 05:59.