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

Ordenar Consulta

Estas en el tema de Ordenar Consulta en el foro de Mysql en Foros del Web. Amigos..... Me estoy cabezeando con algo que alparecer no debe ser muy dificil. Necesito ordenar una consulta de un campo varchar ej: S01 S02 S09-1 ...
  #1 (permalink)  
Antiguo 02/12/2009, 11:40
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 17 años, 5 meses
Puntos: 0
Exclamación Ordenar Consulta

Amigos.....

Me estoy cabezeando con algo que alparecer no debe ser muy dificil.

Necesito ordenar una consulta de un campo varchar ej:

S01
S02
S09-1
S11
S09-2
S12-1
S100
S452
S526


Hago la consulta
Código PHP:
Select from Tabla ORDER BY SUBSTRING_INDEXCodigoInterno'-'ASC 
Y me los Ordena Asi

S01
S02
S09-1
S09-2
S100
S11
S12-1
S452
S526

Necesito que queden asi.

S01
S02
S09-1
S09-2
S11
S12-1
S100
S452
S526

Alguna Idea Gracias Que rollo
  #2 (permalink)  
Antiguo 02/12/2009, 13:16
Avatar de darkasecas  
Fecha de Ingreso: marzo-2005
Ubicación: SantaCata, NL, Mexico
Mensajes: 1.553
Antigüedad: 19 años, 1 mes
Puntos: 77
Respuesta: Ordenar Consulta

Necesitas hacer algo como tomar solo los caracteres despues de la S, castearlos a int y luego ordenarlos
  #3 (permalink)  
Antiguo 02/12/2009, 14:36
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Ordenar Consulta

ya y alguien con experiencia y buena voluntad puede decirme como
  #4 (permalink)  
Antiguo 02/12/2009, 15:13
Avatar de darkasecas  
Fecha de Ingreso: marzo-2005
Ubicación: SantaCata, NL, Mexico
Mensajes: 1.553
Antigüedad: 19 años, 1 mes
Puntos: 77
Respuesta: Ordenar Consulta

Usando (ademas de SUBSTRING_INDEX que ya utilizas) las funciones substr y cast
  #5 (permalink)  
Antiguo 02/12/2009, 15:50
serser
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Ordenar Consulta

A ver si esto te vale:

SELECT * FROM tabla ORDER BY CAST((SUBSTRING_INDEX(TRIM(LEADING 'S' FROM CodigoInterno), '-', 1)) AS DECIMAL) ASC
  #6 (permalink)  
Antiguo 03/12/2009, 05:54
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Ordenar Consulta

Excelente Serser:

Va muy Bien pero la consulta es que en el inventario la primera letra cambia segun el area:


Código PHP:
SELECT FROM tabla ORDER BY CAST((SUBSTRING_INDEX(TRIM(LEADING 'S' FROM CodigoInterno), '-'1)) AS DECIMALASC 
S= Suelos.
H= Hormigon.
E= Elementos.
A= Asfalto.

como puedo cambiarla segun el area o sencillamente no considerar la primera letra en la busqueda, de todas maneras pedo darle solucion en php algo asi

Código PHP:
$sql="SELECT * FROM tabla WHERE AreaAsignada='Hormigon' ORDER BY CAST((SUBSTRING_INDEX(TRIM(LEADING '";
If(
AreaAsignada=="Suelos"){
$sql.=" S ";
}elseIf(
AreaAsignada=="Hormigon"){
$sql.=" H ";
}elseIf(
AreaAsignada=="Asfalto"){
$sql.=" A ";
}elseIf(
AreaAsignada=="Elementos"){
$sql.=" E ";
}
$sql.="' FROM CodigoInterno), '-', 1)) AS DECIMAL) ASC"

Alguna Idea de hacer esto pero en la misma consulta

como ven no soy un experto en Mysql Solo lo basico
  #7 (permalink)  
Antiguo 03/12/2009, 06:27
serser
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Ordenar Consulta

SELECT * FROM tabla ORDER BY CAST((SUBSTRING_INDEX(SUBSTRING(CodigoInterno, 2), '-', 1)) AS DECIMAL) ASC
  #8 (permalink)  
Antiguo 03/12/2009, 07:19
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Ordenar Consulta

Serser:

No es por abusar de tu voluntad

tu ejemplo va excelente pero me ordena asi:

A01
E01
H01
S01
A02
H02
E02
S02

Necesito que se ordene por area y por codigo

A01
A02
E01
E02
H01
H02
S01
S02


probe esto pero no se ordena bien

Código PHP:
SELECT FROM `InventarioORDER BY CAST((SUBSTRING_INDEX(CodigoInterno'-'1)) AS DECIMAL) AS 
resultado

ej:

H05
H06
H07
S509
H08

.. plop
  #9 (permalink)  
Antiguo 03/12/2009, 08:15
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 Consulta

A partir de lo que te propusieron:
Código sql:
Ver original
  1. SELECT *
  2. FROM tabla
  3. ORDER BY CAST((SUBSTRING_INDEX(SUBSTRING(CodigoInterno, 2), '-', 1)) AS DECIMAL) ASC
solo hace falta que pongas a ver bien el tema de funciones.

Analizalo así:

1. Necesitas que te ordene por zona, por número y luego por subindice.
2. Eso significa que debes fragmentar el dato en tres partes.
3. ¿Qué función te puede devolver sólo el primer caracter de la izquierda? Fácil, existe en todos los DBMS: LEFT(string,size).
4. ¿Qué función puede partir una cadena devolviendo una parte u otra? Ya te la dieron: SUBSTRING_INDEX(str, separador, direccion)
5. ¿Qué función permite convertir una cadena en un número? También te lo dieron: CAST( str AS tipo).

Con esto ya deberías poder resolverlo por ti mismo...
Sería algo así:

Código SQL:
Ver original
  1. SELECT *
  2. FROM `Inventario`
  3. ORDER BY LEFT(CodigoInterno,1),
  4.          CAST((SUBSTRING_INDEX(CodigoInterno, '-', 1)) AS DECIMAL),
  5.          CAST((SUBSTRING_INDEX(CodigoInterno, '-', -1)) AS DECIMAL);
Esto ordenaría primero por la letra, luego por la area, y luego por codigo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 22/12/2009, 09:57
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Ordenar Consulta

Retomando el tema cuando hago el
Código:
CAST((SUBSTRING_INDEX(CodigoInterno, '-', -1)) AS DECIMAL)
el Problema es que no todos los codigos internos tienen - por lo cual me devuelve 0 al valor y no ordena ej:

para el codigo A01 como no tiene '-' devuelve 0
para el codigo A02 como no tiene '-' devuelve 0

entonces no ordena.

Alguna Ideal
  #11 (permalink)  
Antiguo 22/12/2009, 10:32
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 Consulta

Eso ya puede indicar que hay inconsistencia de datos, puesto que el esquema de claves debería ser constante, y no lo es si puede haber casoc con y sin "-".
Lo primero que hay que revisar entonces es el origen de esos valores apra asegurar que siempre se presente de la misma forma.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 22/12/2009, 11:25
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Ordenar Consulta

Por lo que entiendo todos los datos deberian tener la misma sitaxis ej. para los codigos que no tengan el "-" habria que agrerarloej:

A01-00
A02-00
A03-00
A03-01

Algo asi..

o a que Inconsistencia te refieres de que tipo
  #13 (permalink)  
Antiguo 22/12/2009, 11:33
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 Consulta

Exactamente a eso. Los datos deben estar normalizados, o de lo contrario la sentencia no devuelve datos, si el esquema de datos esperado es fijo.
En caso contrario, la sentencia debe ser mucho más compleja y considerar la posibilidad de que haya más de un esquema de datos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 22/12/2009, 11:36
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Ordenar Consulta

Muchas Gracias.

siempre es bueno contar con personas con conocimiento y voluntad, me concentrare en poder encontrar una solución, si algo no me resulta bien te volveré a molestar.......
  #15 (permalink)  
Antiguo 23/12/2009, 13:30
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Ordenar Consulta

Ya Muchachos se me torna complicado cambiar la codificación del inventario en estos momentos, por lo cual debo hacer la consulta para que los ordene Mysql,


lo primero la estructura de la codificación se comprende por un identificador del área

S = suelo
A = Asfalto
H = Hormigón
P = Patrones

Seguido de la Identificación del Área va la identificación numérica única para el área quedando el código de la siguiente maneta

S01
A01
H01
P01

En algunos Casos note se ALGUNOSlos equipos poseen accesorios los cuales se identifican con un numero único después de un guion quedando el código así:

S01-01
S01-02
A01
H01
P01-01
P01-02
P01-03

Tengo lo siguiente con mucha ayuda de gnzsoloyo

se fragmenta el código en 3 partes para ordenarlo.

La Primera Parte (area) la ordeno con un

Código PHP:
ORDER BY LEFT(CodigoInterno,1
en la segunda parte del orden gnzsoloyo me sugirió separar el código antes y después del guion

Código PHP:
SELECT *
FROM `Inventario`
ORDER BY LEFT(CodigoInterno,1),
         
CAST((SUBSTRING_INDEX(CodigoInterno'-'1)) AS DECIMAL),
         
CAST((SUBSTRING_INDEX(CodigoInterno'-', -1)) AS DECIMAL); 

El problema es que no todos los equipos tienen accesorios por lo cual no todos los códigos tienen Guion,

Ahora la consulta como puedo ordenar la consulta considerando los codigos con y sin guion.

Se entiende mi consulta ?

Gracias
  #16 (permalink)  
Antiguo 23/12/2009, 15:29
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Ordenar Consulta

killerx_8937:
prueba esto:
Código MySQL:
Ver original
  1. SELECT CodigoInterno FROM Inventario
  2. ORDER BY LEFT(CodigoInterno,1),
  3. CAST(SUBSTRING(SUBSTRING_INDEX(CodigoInterno,'-',1), - (LENGTH(SUBSTRING_INDEX(CodigoInterno,'-',1))-1)) AS UNSIGNED),
  4. IF(INSTR(CodigoInterno,'-') > 0, CAST(SUBSTRING_INDEX(CodigoInterno, '-',-1) AS UNSIGNED),0)

Ya ves que sólo he hecho algunas pruebas parte por parte en la línea de lo que te aconsejaron serser y gnzsoloyo. Recuerda sólo el consejo que te ha dado gnzsoloyo: normaliza los datos para evitar consultas complejas como esta.
  #17 (permalink)  
Antiguo 24/12/2009, 09:41
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Ordenar Consulta

WOW.

De maravilla funciona perfecto puede ser un poco de explicación a este hermoso código, para entender y no cometer entos errores de nuevo.

Gracias jurena
  #18 (permalink)  
Antiguo 24/12/2009, 10:05
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Ordenar Consulta

algo de explicación:
ordeno por 3 partes,
1) por la primera letra, que siempre es una:
ORDER BY LEFT(CodigoInterno,1),
esto usa como primer criterio para ordenar la S, A, H, P que tienes

2) por el resto de la primera parte antes del guión, lo haya o no, pero quitando la primera letra y haciendo un casting a número (al substring_index le hacemos un substring que carga el número de caracteres total de ese substring_index menos 1, y lo pongo en negativo para que separe esa número de caracteres comenzando desde el final. Es decir, separo de la primera parte hasta el guión (si lo hay) o toda esa primera parte si no lo hay, toda la cadena menos el primer carácter (recuerda que se trata de S,A,H,P), y eso lo hago mediante un SUBSTRING(cadena,- (longitud de la cadena -1)), y mediante un cast a numérico ya puedo ordenar como número esa parte.
CAST(SUBSTRING(SUBSTRING_INDEX(CodigoInterno,'-',1), - (LENGTH(SUBSTRING_INDEX(CodigoInterno,'-',1))-1)) AS UNSIGNED),

3) si hay guión (lo compruebo con INSTR, buscando la posición del guión (si la hay, su posición en la cadena será un número mayor que 0), hago un cast a número de substring_index, con negativo, es decir, empezando desde el final; pero si no hay guión, y aquí radicaba parte del problema, la posición no será mayor que 0 y, en ese caso, ordenará por 0: eso lo hago con el IF
IF(INSTR(CodigoInterno,'-') > 0, CAST(SUBSTRING_INDEX(CodigoInterno, '-',-1) AS UNSIGNED),0)
Naturalmente, también le hago un cast a numérico.

Ya tengo las tres partes y ordeno de forma consecutiva: primero por la primera, segundo por la segunda y tercero por la tercera. Eso es todo.

Última edición por jurena; 25/12/2009 a las 03:36
  #19 (permalink)  
Antiguo 04/01/2010, 07:47
Avatar de Killerx_8937  
Fecha de Ingreso: noviembre-2006
Mensajes: 99
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Ordenar Consulta

Gracias jurena Por Responder y explicar la consulta aclaro muchas de mis dudas, pero dime algo Según tu es mejor manejar el código como lo estoy manejando o separar en 3 campos diferentes el código algo así como:

El primer campo seria para el area

NomArea Ej: S

El Segundo Para el código en si

NumCod Ej: 456

Y El Tercero para los Accesorios

CodAcc Ej: 01


con esto podriamos hacer una consulta asi

Código:
Select * From Inventario Where NomArea='s' and NumCod='456' and CodAcc='01' Order BY NomArea, NumCod, CodAcc ASC


Que opinan amigos quisiera saber a su criterio cual seria la forma mas eficiente recuerden que es un inventario
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:03.