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

[SOLUCIONADO] Tomar el maximo entre varios resultados

Estas en el tema de Tomar el maximo entre varios resultados en el foro de Mysql en Foros del Web. Buenas estimados, tengo la siguiente cuestión: Tengo una consulta donde muestro un listado de clientes, como hay fechas de vencimiento pueden existir mas de un ...
  #1 (permalink)  
Antiguo 09/07/2014, 20:11
 
Fecha de Ingreso: noviembre-2009
Mensajes: 381
Antigüedad: 15 años
Puntos: 6
Tomar el maximo entre varios resultados

Buenas estimados, tengo la siguiente cuestión:

Tengo una consulta donde muestro un listado de clientes, como hay fechas de vencimiento pueden existir mas de un row por cliente.

Entonces, teniendo en cuenta esta fecha de vencimiento, necesito tomar la ultima de cada cliente.

Hice la consulta asi pero no estoy teniendo el resultado que necesito:

Código SQL:
Ver original
  1. SELECT    
  2. de.id,
  3. de.nombre AS nombre_deposito,
  4. td.tipo,
  5. ci.localidad,
  6. pr.provincia,
  7. ca.categoria AS categoria,
  8. dc.fecha AS fecha_certificado,
  9. DATE_ADD(dc.fecha, INTERVAL ca.tiempos DAY) AS vencimiento,
  10. de.comentarios
  11. FROM depositos de
  12. LEFT JOIN depositoscertificacion dc ON (dc.depositoId = de.id)
  13. LEFT JOIN categorias ca ON (ca.id = dc.categoria)
  14. LEFT JOIN provincias pr ON (de.provincia = pr.id)
  15. LEFT JOIN ciudades ci ON (de.ciudad = ci.id)
  16. LEFT JOIN tipodeposito td ON (td.id = de.tipo)
  17. WHERE de.id > 0
  18. GROUP BY de.id
  19. ORDER BY fecha_certificado DESC, td.tipo ASC

Me muestra una fecha por cliente pero no la ultima.

Ok, posiblemente deba usar subconsultas o algo mas complejo, pero no me doy cuenta como encararlo.

Muchas gracias de antemano por cualquier ayuda,
Gustav.
  #2 (permalink)  
Antiguo 10/07/2014, 01:43
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: Tomar el maximo entre varios resultados

Código MySQL:
Ver original
  1. SELECT    
  2. de.id,
  3. de.nombre AS nombre_deposito,
  4. td.tipo,
  5. ci.localidad,
  6. pr.provincia,
  7. ca.categoria AS categoria,
  8. MAX(dc.fecha) AS fecha_certificado,
  9. DATE_ADD(MAX(dc.fecha), INTERVAL ca.tiempos DAY) AS vencimiento,
  10. de.comentarios
  11. FROM depositos de
  12. LEFT JOIN depositoscertificacion dc ON (dc.depositoId = de.id)
  13. LEFT JOIN categorias ca ON (ca.id = dc.categoria)
  14. LEFT JOIN provincias pr ON (de.provincia = pr.id)
  15. LEFT JOIN ciudades ci ON (de.ciudad = ci.id)
  16. LEFT JOIN tipodeposito td ON (td.id = de.tipo)
  17. WHERE de.id > 0
  18. GROUP BY de.id
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 10/07/2014, 07:06
 
Fecha de Ingreso: noviembre-2009
Mensajes: 381
Antigüedad: 15 años
Puntos: 6
Respuesta: Tomar el maximo entre varios resultados

Buenas estimado,

hice lo mismo pero joinea mal la tabla categorias, cuando esta sin el MAX aparece la categoria A (por decir algo) y cuando uso el MAX aparece la categoria C.

Muchas gracias igual!
Gustav.
  #4 (permalink)  
Antiguo 10/07/2014, 07:54
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Tomar el maximo entre varios resultados

Vamos a aclarar una cosa: LEFT JOIN y RIGHT JOIN se usan exclusivamente cuando una relación dada es opcional, y se desean obtener aquellos registros sin coincidencias.
En tu diseño, me resulta muy poco creíble que no haya relaciones mandatorias entre las tablas depositos, depositoscertificacion, categorias, provincias, ciudades y tipodeposito. AL menos desde el punto de vista de análisis de sistemas, ese tipo e relaciones debería ser obligatoria.

Por otro lado, si lo que quieres es el registro más reciente, hay un modo más simple.
Supongamos que las relaciones son mandatorias, y probemos esto:
Código MySQL:
Ver original
  1. SELECT de.id, nombre_deposito, tipo, localidad, provincia, categoria, fecha_certificado, vencimiento, comentarios
  2.     (SELECT    
  3.         de.id,
  4.         de.nombre nombre_deposito,
  5.         td.tipo,
  6.         ci.localidad,
  7.         pr.provincia,
  8.         ca.categoria categoria,
  9.         dc.fecha fecha_certificado,
  10.         DATE_ADD(dc.fecha, INTERVAL ca.tiempos DAY) AS vencimiento,
  11.         de.comentarios
  12.     FROM depositos de
  13.         INNER JOIN depositoscertificacion dc ON (dc.depositoId = de.id)
  14.         INNER JOIN categorias ca ON (ca.id = dc.categoria)
  15.         INNER JOIN provincias pr ON (de.provincia = pr.id)
  16.         INNER JOIN ciudades ci ON (de.ciudad = ci.id)
  17.         INNER JOIN tipodeposito td ON (td.id = de.tipo)
  18.     ORDER BY fecha_certificado DESC, td.tipo ASC) T1
Por otro lado te destaco que si la columna "ID" de la tabla DEPOSITOS es la clave primaria, esto:
Código MySQL:
Ver original
  1. WHERE de.id > 0
no tiene sentiudo, porquer una PK jamás puede ser cero ni tener un valor negativo.

Partamos de esa prueba, dinos qué es lo que te devuelve, y dinos qué es lo que debería devolver.
Postea tablas con 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)
  #5 (permalink)  
Antiguo 10/07/2014, 07:59
 
Fecha de Ingreso: noviembre-2009
Mensajes: 381
Antigüedad: 15 años
Puntos: 6
Respuesta: Tomar el maximo entre varios resultados

Muchas gracias,

uso LEFT JOIN porque los datos son emigrados de una base vieja en access y hay muchas inconsistencias, hasta que el administrador no ponga todo en orden, se leerán los datos con LEFT JOIN. No puedo asumir que todos los datos estam completos.

Sobre el resto, lo voy a probar y les aviso!
Muchas gracias,
Gustav.
  #6 (permalink)  
Antiguo 10/07/2014, 08:10
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Tomar el maximo entre varios resultados

Pues en ese caso será mejor que primero depuren los datos, porque de lo contrario se producirán demasiados errores en el resultado, basandose en datos sucios.

Por otro lado, el uso de LEFT JOIN puede terminar generando productos cartesianos, y como consecuencia los resultados son incorrectos, repetidos, o falsos.

Recuerda siemrpe que si los datos están sucios, los resultados son simple basura. Y eso si es una regla absoluta (milagros aparte).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 11/07/2014, 08:33
 
Fecha de Ingreso: noviembre-2009
Mensajes: 381
Antigüedad: 15 años
Puntos: 6
Respuesta: Tomar el maximo entre varios resultados

Buenas, la consulta como necesitaba:

Código MySQL:
Ver original
  1.     SELECT
  2.     dc.id AS dcid,
  3.     de.id AS deid,
  4.     de.nombre AS nombre_deposito,
  5.     td.tipo AS tipo,
  6.     ci.localidad AS localidad,
  7.     pr.provincia AS provincia,
  8.     ca.categoria AS categoria,
  9.     dc.fecha AS fecha_certificado,
  10.     DATE_ADD(dc.fecha, INTERVAL ca.tiempos DAY) AS vencimiento,
  11.     de.comentarios AS comentarios
  12.     FROM depositos de
  13.     LEFT JOIN depositoscertificacion dc ON (dc.depositoId = de.id)
  14.     LEFT JOIN categorias ca ON (ca.id = dc.categoria)
  15.     LEFT JOIN provincias pr ON (de.provincia = pr.id)
  16.     LEFT JOIN ciudades ci ON (de.ciudad = ci.id)
  17.     LEFT JOIN tipodeposito td ON (td.id = de.tipo)
  18.     ORDER BY vencimiento DESC, td.tipo ASC
  19. ) a

Saludos y muchas gracias!
Gustav.

Etiquetas: join, maximo, resultados, select, tomar
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 16:02.