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

Dudas con sentencia MAX

Estas en el tema de Dudas con sentencia MAX en el foro de Mysql en Foros del Web. Hola disculpen tengo un problemilla,yo tengo una tabla Detalle_Examen cuyo campo id es un correlativo que va asi: "DEXAM1","DEXAM2","DEXAM3",...., y tengo esta sentencia: select max(idDeatll_examen) ...
  #1 (permalink)  
Antiguo 07/06/2009, 09:52
 
Fecha de Ingreso: abril-2009
Ubicación: Lima
Mensajes: 108
Antigüedad: 15 años
Puntos: 0
Dudas con sentencia MAX

Hola disculpen tengo un problemilla,yo tengo una tabla Detalle_Examen cuyo campo id es un correlativo que va asi: "DEXAM1","DEXAM2","DEXAM3",...., y tengo esta sentencia: select max(idDeatll_examen) as idDet from detalle_examen esto me funcionaba bien hasta que el campo id llego hasta "DEXAM9", cuando ejecutaba la sentencia me botaba el mayor, q en este aso era esa: "DEXAM9"...mi problema vino cuando inserte una mas(es decir "DEXAM10"), cuando volví a correr la sentencia anterior me sigue saliendo "DEXAM9", cuando debería salirme "DEXAM10"...a qué se puede deber esto???
  #2 (permalink)  
Antiguo 07/06/2009, 10:04
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Dudas con sentencia MAX

DEXAM1
DEXAM2
DEXAM3
...

Ese id es alfanumerico luego se ordena como tal, igual que se ordenan las palabras en un diccionario

DEXAM1
DEXAM10
DEXAM100
DEXAM1000
DEXAM2
DEXAM20
DEXAM21
DEXAM3
DEXAM30
...

Si quieres que se ordene numericamente elimina la parte constante "DEXAM", usa un id numerico. "DEXAM" no aporta nada ...

Quim
  #3 (permalink)  
Antiguo 07/06/2009, 10:18
 
Fecha de Ingreso: abril-2009
Ubicación: Lima
Mensajes: 108
Antigüedad: 15 años
Puntos: 0
Respuesta: Dudas con sentencia MAX

Gracias por la rpta, lo q pasa es que necesito que el codigo sea así,tambien tengo otra que es de muestras donce mi codigo es Mue1,Mue2,Mu3...., hay alguna manera de como hacerlo,o eso ya seria parte del codigo, gracias
  #4 (permalink)  
Antiguo 07/06/2009, 10: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, 5 meses
Puntos: 2658
Respuesta: Dudas con sentencia MAX

A que está usando un campo VARCHAR, en lugar un campo numérico.
Es en definitiva un problema de cómo implementaste el modelo. Has querido darle una característica mnemotécnica a la clave, pero sin considerar que para incorporar un valor numérico incremental a un string, a fin de que este mantenga un buen ordenamiento, debes "spanear" los caracteres que serán usados para el número.
Me explico:
Has creado una clave que comienza con "DEXAM" (técnicamente innecesario), que se ordena alfabéticamente, a la que le adicionas el numero de examen, pero sin considerar que al hacerlo los dígitos pasan a ser caracteres, y por tanto se ordenan como tales.
Esto hace que el orden comience:
Cita:
DEXAM1
DEXAM2
DEXAM3
DEXAM4
DEXAM5
DEXAM6
DEXAM7
DEXAM8
DEXAM9
El problema es que DEXAM10, al ordenarse como caracteres no le corresponde la posicion final, sino entre DEXAM1 y DEXAM2, ya que comienza igual que DEXAM1 pero su valor como caracteres es superior (tiene un caracter más), pero inferior a DEXAM2 (el valor ASCII de "1" es inferior al de "2" .
Para resolver este tipo de problemas lo que se suele hacer es crear un patrón de dígitos que se adicionará a "DEXAM", rellenandolo con ceros y usandolo para poner el número:
Cita:
DEXAM00001
DEXAM00002
DEXAM00003
DEXAM00004
DEXAM00005
DEXAM00006
DEXAM00007
DEXAM00008
DEXAM00009
DEXAM00010
DEXAM00011
...
En principio, el problema es que el ID que está usando es ineficiente (requiere más ancho de campo que uno numérico), y además complica las búsquedas a futuro. Si tu problema es que usas la misma tabla para almacenar diferentes tipos de examen, entonces el planteo está mal pensado de inicio, porque eso se aleja de un modelo E-R bien diseñado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 08/06/2009, 04:07
 
Fecha de Ingreso: marzo-2004
Mensajes: 32
Antigüedad: 20 años, 1 mes
Puntos: 0
Respuesta: Dudas con sentencia MAX

Podrías probar algo con la sentencia LEFT en el order, parecido a lo que jurena ha montado en el enlace:

forosdelweb.com/f86/order-no-ordena-707243/

(disculpa pero todavía no puedo poner enlaces)
  #6 (permalink)  
Antiguo 08/06/2009, 05:21
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, 5 meses
Puntos: 2658
Respuesta: Dudas con sentencia MAX

Es posible que para solvertar la situación pudieras usar, más que LEFT(), MID(), de modo de convertir la parte restante de la clave en un numero.
Algo así:
Código SQL:
Ver original
  1. SELECT CAST(MID(campo,5,(LENGTH(campo)-4)) AS INTEGER) orden
  2. FROM tabla;
La idea es que tome los X caracteres desde la posición 5 (primer dígito de la clave), siendo x equivalente al largo del contenido del campo menos los primero 4 caracteres, y a eso lo convierta en un entero.
El único inconveniente que tiene esto es que el resultado no puede usarse inmediatamente como comparador en el WHERE, pero si se puede ordenar por él.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 09:03.