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

Ordenar

Estas en el tema de Ordenar en el foro de Mysql en Foros del Web. Buenas tardes tengo un inconveniente, resulta que yo hago una consulta a una tabla normal y le dijo que muestre ordenado asc pero después de ...
  #1 (permalink)  
Antiguo 02/12/2013, 14:24
Avatar de JeMaGa  
Fecha de Ingreso: julio-2011
Ubicación: Bogota
Mensajes: 430
Antigüedad: 12 años, 9 meses
Puntos: 4
Ordenar

Buenas tardes

tengo un inconveniente, resulta que yo hago una consulta a una tabla normal y le dijo que muestre ordenado asc pero después de una cantidad se organiza no ascendente mente

hago una consulta que tiene mas de 10.000 registros y estoy mostrando todos los registros a través de paginacion desde php el problema que tengo es que hasta el 9999 lo muestra ordenado

1...
2...
3....
4....
1000.....
2000....
9999

Cuando se supone que debe seguir mostrando
10000
10001
.....
pero estos ya no los muestras despues del 9999 si no los muestra despues del 1000, como puedo organizar esto para que el 10000 para abajo quede despues del 9999


la consulta es esta

Código MySQL:
Ver original
  1. select ex.*
  2. from `externos13` ex inner join `confirmacion13` co on ex.`No.Analisis`=co.`Analisis`
  3. where co.`Abreviatura`='MBE' and ex.`AnoActual` like '%$clave%'
  4. order by ex.`No.Analisis` asc

Última edición por gnzsoloyo; 02/12/2013 a las 14:50
  #2 (permalink)  
Antiguo 02/12/2013, 14:50
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Ordenar

Cita:
pero estos ya no los muestras despues del 9999 si no los muestra despues del 1000, como puedo organizar esto para que el 10000 para abajo quede despues del 9999
Eso es un comportamiento típico, producto de haber definido una columna que debió ser numérica como VARCHAR.
¿Es así o es numérico?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 02/12/2013, 15:00
Avatar de JeMaGa  
Fecha de Ingreso: julio-2011
Ubicación: Bogota
Mensajes: 430
Antigüedad: 12 años, 9 meses
Puntos: 4
Respuesta: Ordenar

si es varchar pero si fuera un tipo int puedo agregar - es que yo guardo en ese campo 13-10000
pero eso no me lo aceptaria si el campo fuera int o si???
  #4 (permalink)  
Antiguo 02/12/2013, 15:26
Avatar de JeMaGa  
Fecha de Ingreso: julio-2011
Ubicación: Bogota
Mensajes: 430
Antigüedad: 12 años, 9 meses
Puntos: 4
Respuesta: Ordenar

Listo por hay encontre que con cast pero al intentar hacerlo con eso me saca error

Código MySQL:
Ver original
  1. SELECT ex.* FROM `externos13` ex INNER JOIN `confirmacion13` co ON ex.`No.Analisis`=co.`Analisis`
  2. WHERE co.`Abreviatura`='MBE' AND ex.`AnoActual` LIKE '%2013%' ORDER BY CAST(ex.`No.Analisis` AS INT);

Gracias
  #5 (permalink)  
Antiguo 02/12/2013, 15:27
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Ordenar

No, no lo aceptará.
El tema tiene solucion, pero primero, ¿Por que lo guardas así?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 02/12/2013, 15:31
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Ordenar

Hola JeMaGa

Tal como lo mencionó gnzsoloyo, el problema es porque no es lo mismo ordenar una cadena que contiene números a ordenar un número... observa este ejemplo


Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla ORDER BY campo;
  2. +--------+
  3. | campo  |
  4. +--------+
  5. | 10-1   |
  6. | 10-10  |
  7. | 10-100 |
  8. | 10-111 |
  9. | 10-2   |
  10. | 10-3   |
  11. +--------+
  12. 6 rows in set (0.01 sec)

Si bien la solución que planteas puede servirte, NO ES LA MEJOR OPCIÓN.
Esto puede traerte muchos problemas... por un lado, nadie te asegura que siempre puedas realizar la conversión, es decir, imagina que almacenas letras o caracteres especiales... esto es por lo que NO DEBES UTILIZAR CAMPOS VARCHAR PARA ALMACENAR ESTE TIPO DE CAMPOS...

El Guión que mencionas NO SIRVE ABSOLUTAMENTE PARA NADA... lo ideal es que tuvieras dos campos, uno con la primer parte de tu cadena y otro con la segunda parte... si necesitas presentar el GUION al usuario, simplemente haces esto:

Código MySQL:
Ver original
  1. mysql> SELECT campo1, campo2 FROM tabla;
  2. +--------+--------+
  3. | campo1 | campo2 |
  4. +--------+--------+
  5. |     10 |      1 |
  6. |     ab |    def |
  7. |     10 |      3 |
  8. |     10 |     10 |
  9. |     10 |    111 |
  10. |     10 |    100 |
  11. +--------+--------+
  12. 6 rows in set (0.00 sec)
  13.  
  14. mysql> SELECT CONCAT(campo1, '-', campo2) FROM tabla;
  15. +-----------------------------+
  16. | CONCAT(campo1, '-', campo2) |
  17. +-----------------------------+
  18. | 10-1                        |
  19. | ab-def                     |
  20. | 10-3                        |
  21. | 10-10                       |
  22. | 10-111                      |
  23. | 10-100                      |
  24. +-----------------------------+
  25. 6 rows in set (0.00 sec)
Saludos
Leo.
  #7 (permalink)  
Antiguo 02/12/2013, 15:36
Avatar de JeMaGa  
Fecha de Ingreso: julio-2011
Ubicación: Bogota
Mensajes: 430
Antigüedad: 12 años, 9 meses
Puntos: 4
Gracias, necesito ingresar el valor asi por que el 13 es 2013 el proximo año sera 14-0001 es 2014 por eso lo almaceno de esa forma.

osea leonardo_josue que tendria que cambiar todas las tabla y agregarles un campo mas quitando el - y separando el valor 13 en un campo 10000 en otro ? y en caso tal que lo quiera hacer con cast como se podría hacer??

Última edición por gnzsoloyo; 02/12/2013 a las 16:14
  #8 (permalink)  
Antiguo 02/12/2013, 16:20
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Ordenar

Cita:
Iniciado por JeMaGa Ver Mensaje
Gracias, necesito ingresar el valor asi por que el 13 es 2013 el proximo año sera 14-0001 es 2014 por eso lo almaceno de esa forma.

osea leonardo_josue que tendria que cambiar todas las tabla y agregarles un campo mas quitando el - y separando el valor 13 en un campo 10000 en otro ? y en caso tal que lo quiera hacer con cast como se podría hacer??
En realidad te conviene, como ya te han sugerido, almacenarlos en dos campos (que por otro lado, guardar el año con dos dígitos... es una muy mala opción).
Y en todo caso, reconstruir un numero puesto como AA-NNNNNN, es simplemente usar un CONCAT, probablemente junto a un LPAD(), si es que se necesita.
CAST sólo no es totalmente funcional para tu caso, sino en todo caso un SUBSTRING_INDEX().
Código MySQL:
Ver original
  1. SELECT a, b, c, d
  2. FROM tabla
  3. ORDER BY CAST(SUBSTRING_INDEX(campo, '-', -1) AS UNSIGNED), CAST(SUBSTRING_INDEX(campo, '-', 1) AS UNSIGNED);
Como verás, sería muchísimo más simple escribir
Código MySQL:
Ver original
  1. SELECT a, b, c, d
  2. FROM tabla
  3. ORDER BY campo1, campo2;
Es muy habitual en los que recién se inician pesar en lo que se ve, y no en lo que se debe almacenar, que no son exactamente la misma cosa. Es una parte de la diferencia entre razonar como programador y como DBA.
Lo que al programador le parece fácil, porque es "simple", luego trae muuuuchas complicaciones en las consultas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 02/12/2013, 16:28
Avatar de JeMaGa  
Fecha de Ingreso: julio-2011
Ubicación: Bogota
Mensajes: 430
Antigüedad: 12 años, 9 meses
Puntos: 4
Respuesta: Ordenar

A muchas gracias tomare en cuenta los consejos y espero que de esta forma me funcione lo que necesito si algo estaré informandolo gracias
  #10 (permalink)  
Antiguo 03/12/2013, 08:35
Avatar de JeMaGa  
Fecha de Ingreso: julio-2011
Ubicación: Bogota
Mensajes: 430
Antigüedad: 12 años, 9 meses
Puntos: 4
Respuesta: Ordenar

Bueno intente hacer lo de separar los campos y es un proceso canson hay mas de 10000 registros en mas de una tabla ponerme a cambiar el numero a todos es muy complicado, puede que no sea la mejor forma y puede que no funcione completamente pero como puedo organizar el numero como lo tengo ascendente mente que despues del 9999 siga el 10000 y de hay para abajo

Gracias por la colaboracion
  #11 (permalink)  
Antiguo 03/12/2013, 08:40
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Ordenar

Cita:
Iniciado por JeMaGa Ver Mensaje
Bueno intente hacer lo de separar los campos y es un proceso canson hay mas de 10000 registros en mas de una tabla ponerme a cambiar el numero a todos es muy complicado, puede que no sea la mejor forma y puede que no funcione completamente pero como puedo organizar el numero como lo tengo ascendente mente que despues del 9999 siga el 10000 y de hay para abajo

Gracias por la colaboracion
Eso ya te lo expliqué.
Código SQL:
Ver original
  1. SELECT a, b, c, d
  2. FROM tabla
  3. ORDER BY CAST(SUBSTRING_INDEX(campo, '-', -1) AS UNSIGNED), CAST(SUBSTRING_INDEX(campo, '-', 1) AS UNSIGNED);
¿Qué parte no se entiende?

De hecho, si realmente quieres modificar tu tabla, la cosa es simple, podrías perfectamente hacer lo siguiente:

Código SQL:
Ver original
  1. ALTER TABLE tabla ADD COLUMN anio SMALLINT UNSIGNED;
  2.  
  3. ALTER TABLE tabla ADD COLUMN anio_item MEDIUMINT UNSIGNED;
  4.  
  5. UPDATE tabla
  6. SET anio = CAST(SUBSTRING_INDEX(campo, '-', 1) AS UNSIGNED),
  7. anio_item = CAST(SUBSTRING_INDEX(campo, '-', -1) AS UNSIGNED);
  8.  
  9. ALTER TABLE tabla DROP COLUMN campo;
  10.  
  11. SELECT CONCAT(anio, '-', adion_item) codigo, a, b, c, d
  12. FROM tabla
  13. ORDER BY anio, anio_id;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 03/12/2013 a las 09:24
  #12 (permalink)  
Antiguo 03/12/2013, 09:06
Avatar de JeMaGa  
Fecha de Ingreso: julio-2011
Ubicación: Bogota
Mensajes: 430
Antigüedad: 12 años, 9 meses
Puntos: 4
Respuesta: Ordenar

que pena pero hay cosas, sentencias que no entiendo, me las puedes explicar por favor que hace esto

SMALLINT UNSIGNED;

fue lo que me dijiste que hiciera ... CAST(SUBSTRING_INDEX(campo, '-', 1) AS UNSIGNED pero para que, que hace ???
  #13 (permalink)  
Antiguo 03/12/2013, 09:27
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Ordenar

El manual de referencia trae todas las explicaciones que se necesitan sobre esos temas.
Y no te ofendas, pero es lo mismo que hacemos todos los que trabajamos profesionalmente en BBDD, porque nadie se pone a memorizar todo. Y menos aún cuando los manuales son tan claros...

Para SUBSTRING_INDEX(): http://dev.mysql.com/doc/refman/5.0/...functions.html

Para CAST: http://dev.mysql.com/doc/refman/5.0/...functions.html

Y para los tipos de datos numéricos: http://dev.mysql.com/doc/refman/5.0/...ric-types.html

Como sea, lo básico es que el tipo e dato numerico determina el rango de numeros útiles, y cuando tiene signo ese rango se reduce a la mitad.

Si alguna vez has programado en C++, C o VB.Net, debes concoer los tipos numericos de 8, 16, 32 y 64 bits. MySQL los ha heredado de C++.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 03/12/2013 a las 09:35

Etiquetas: join, php, registro, select, tabla
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 10:48.