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

subquery depende del Query

Estas en el tema de subquery depende del Query en el foro de Mysql en Foros del Web. Buenas tardes, necesito ayuda con lo siguiente: Tengo las tablas.. - TANQUES, con los campos id_tanque y capacidad, (hay mas pero estos son los mas ...
  #1 (permalink)  
Antiguo 17/09/2009, 15:55
 
Fecha de Ingreso: abril-2008
Mensajes: 17
Antigüedad: 16 años
Puntos: 0
subquery depende del Query

Buenas tardes, necesito ayuda con lo siguiente:
Tengo las tablas..
- TANQUES, con los campos id_tanque y capacidad, (hay mas pero estos son los mas importantes) y
- VENCIMIENTOS, con id_tanque y fecha
Cada tanque entonces puede tener varios vencimientos que se registran con su ID en esta tabla.

El problema surge cuando quiero hacer una consulta de los tanques y quiero que me salgan sus datos y el ultimo vencimiento.
Habia pensado hacer un select con un subquery en la condicion, algo asi:

SELECT * FROM tanques LEFT OUTER JOIN vencimientos ON tanques.id_tanque = vencimientos.id_tanque WHERE fecha = ( select max(fecha) from vencimientos where id_tanque = ?? )
Ahi no se como hacer para que de cada tanque me tome el mayor valor, depende del primer SELECT.
Si alguien sabe como se hace espero su ayuda, Gracias!
  #2 (permalink)  
Antiguo 17/09/2009, 16:13
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: subquery depende del Query

Creo que te estás complicando demasiado:
Código sql:
Ver original
  1. SELECT *
  2. FROM tanques T LEFT JOIN vencimientos V USING(id_tanque)
  3. ORDER BY V.fecha
  4. DESC LIMIT 1;
o bien:
Código sql:
Ver original
  1. SELECT *
  2. FROM tanques T LEFT JOIN vencimientos V USING(id_tanque)
  3. HAVING V.fecha <= MAX(V.fecha);
... y otras formas más.

No es buena idea usar subconsultas si no es realmente necesario. Una subconsulta sobre la misma tabla puede representar el doble de accesos a disco que con una sola consulta, en a cual pueda obtenerse la misma ifo.

Nota: En MySQL, LEFT OUTER JOIN existe sólo por compatibilidad con ODBC. Si no lo usas, entonces es mejor usar otro tipo de sintaxis.
__________________
¿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 18/09/2009, 08:36
 
Fecha de Ingreso: abril-2008
Mensajes: 17
Antigüedad: 16 años
Puntos: 0
Respuesta: subquery depende del Query

Hola! buenisimo gracias por la respuesta, pero me sirve en parte nada mas, porque lo que me tira esa consulta es un solo registro con el tanque de mayor fecha y yo lo que necesito es de cada tanque la mayor fecha, por eso pense en utilizar una subquery, pero bueno mejor no utilizarla.

Por ejemplo:
* TANQUES
id_tanque: 01 02 03
capacidad: 70 85 90

* VENCIMIENTOS:
id_tanque - vencimiento:
01 - 31/12/2008
01 - 31/12/2009
02 - 31/12/2007
02 - 31/12/2005
03 - 31/12/2010
03 - 31/12/2012
03 - 31/12/2009

Yo necesito que me devuelva algo asi:
01 - 70 - 31/12/2009
02 - 85 - 31/12/2007
03 - 90 - 31/12/2012

Desde ya gracias al que me pueda ayudar.
  #4 (permalink)  
Antiguo 18/09/2009, 09:14
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: subquery depende del Query

Código sql:
Ver original
  1. SELECT TANQUES.id_tanque, TANQUES.capacidad, t1.fecha FROM TANQUES
  2.  INNER JOIN (SELECT id_tanque, MAX(vencimiento) fecha FROM VENCIMIENTOS GROUP BY id_tanque)t1
  3. ON t1.id_tanque = TANQUES.id_tanque ORDER BY TANQUES.id_tanque
No lo he probado
  #5 (permalink)  
Antiguo 18/09/2009, 09:24
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: subquery depende del Query

Si lo que quieres es la información de cada tanque, entonces, como sugiere jurena, hay que hacer un agrupamiento por el tanque y solicitar la fecha máxima de cada caso:

Código sql:
Ver original
  1. SELECT id_tanque, capacidad, MAX(V.vencimiento) vencimiento
  2. FROM tanques T INNER JOIN vencimientos V USING(id_tanque)
  3. GROUP BY id_tanque
  4. ORDER BY V.fecha
__________________
¿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 18/09/2009, 12:02
 
Fecha de Ingreso: abril-2008
Mensajes: 17
Antigüedad: 16 años
Puntos: 0
Respuesta: subquery depende del Query

Perfecto ambos querys funcionan muy bien, gracias a los 2.
La ultima y con esto terminamos, porque le tengo que agregar el campo "NroCertificado" a la tabla VENCIMIENTOS y que la consulta me lo muestre (obviamente el que le corresponde a la fecha maxima)

La tabla quedaria asi, VENCIMIENTOS: id_tanque - vencimiento - NroCertificado
Y el resultado del query tendria que ser: id_tanque - capacidad - vencimiento - Nro Certificado.

En donde deberia agregarlo o como quedaria?
Gracias!!
  #7 (permalink)  
Antiguo 18/09/2009, 12: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, 5 meses
Puntos: 2658
Respuesta: subquery depende del Query

Código sql:
Ver original
  1. SELECT id_tanque, capacidad, MAX(V.vencimiento) vencimiento, V.NroCertificado
  2. FROM tanques T INNER JOIN vencimientos V USING(id_tanque)
  3. GROUP BY id_tanque
  4. ORDER BY V.fecha
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 18/09/2009, 12:58
 
Fecha de Ingreso: abril-2008
Mensajes: 17
Antigüedad: 16 años
Puntos: 0
Respuesta: subquery depende del Query

mmm No... no me toma el Nro de Certificado del que tiene la mayor fecha.. toma cualquiera o el primero, no se... algo le falta me parece, puede ser?
  #9 (permalink)  
Antiguo 18/09/2009, 13:44
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: subquery depende del Query

Prueba:
Código sql:
Ver original
  1. SELECT *
  2. FROM
  3.    (SELECT id_tanque, capacidad, MAX(V.vencimiento) vencimiento, V.NroCertificado
  4.    FROM tanques T INNER JOIN vencimientos V USING(id_tanque)
  5.    ORDER BY id_tanque ASC, V.fecha DESC) t1
  6. GROUP BY id_tanque;
__________________
¿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 18/09/2009, 14:30
 
Fecha de Ingreso: abril-2008
Mensajes: 17
Antigüedad: 16 años
Puntos: 0
Respuesta: subquery depende del Query

No tampoco, esta consulta sigue tirando mal el Nro de Certificado y ahora solamente da un registro, el del tanque de mayor fecha de vencimiento..
  #11 (permalink)  
Antiguo 18/09/2009, 14:58
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: subquery depende del Query

Código sql:
Ver original
  1. SELECT *
  2. FROM
  3.    (SELECT id_tanque, capacidad, V.vencimiento, V.NroCertificado
  4.    FROM tanques T INNER JOIN vencimientos V USING(id_tanque)
  5.    ORDER BY V.fecha DESC, id_tanque ASC) t1
  6. GROUP BY id_tanque;
Perdón por la distracción...
Si esto no te devuelve el certificado correcto, mira esto:
Código sql:
Ver original
  1. SELECT id_tanque, capacidad, V.vencimiento, V.NroCertificado
  2. FROM tanques T LEFT JOIN vencimientos V USING(id_tanque)
  3. ORDER BY V.fecha DESC, id_tanque ASC
Esa sería la coincidencia de certificados y fechas con los tanques.
Si salen nulos, es porque no hay coincidencias...
__________________
¿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 18/09/2009, 15:32
 
Fecha de Ingreso: abril-2008
Mensajes: 17
Antigüedad: 16 años
Puntos: 0
Respuesta: subquery depende del Query

Ahora me parece que si... funciona bien!
El ultimo query muestra todos los tanques con el correspondiente Nro de Certificado. Y el primero a simple vista esta bien, me tira solo los de la fecha max y con el certif que corresponde.
Asi que voy a probarlo mas detalladamente y cualquier cosa vuelvo a preguntar..
Me sirvio mucho tu ayuda, muchas gracias!
  #13 (permalink)  
Antiguo 18/09/2009, 16: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, 5 meses
Puntos: 2658
Respuesta: subquery depende del Query

Me alegra que resultara.
Suerte
__________________
¿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 18:49.