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

[SOLUCIONADO] Sub consulta en LEFT JOIN con LIMIT

Estas en el tema de Sub consulta en LEFT JOIN con LIMIT en el foro de Mysql en Foros del Web. Hola a todos, tengo un problema con una consulta, se que esta mal realizada porque no obtengo los resultados requeridos. El escenario es: tengo 2 ...
  #1 (permalink)  
Antiguo 26/04/2012, 20:20
Avatar de kivpson  
Fecha de Ingreso: marzo-2011
Mensajes: 37
Antigüedad: 13 años, 1 mes
Puntos: 7
Sub consulta en LEFT JOIN con LIMIT

Hola a todos, tengo un problema con una consulta, se que esta mal realizada porque no obtengo los resultados requeridos.

El escenario es: tengo 2 tablas, una que almacena bases, y otra los saldos de cada dia, ahora resulta que deseo realizar una consulta que me devuelva el ultimo saldo de cada base.

| bases
+--------
| id_base
| nombre_base


| historial_saldos
+--------
| id_historial_base
| id_base
| saldo_actual
| fecha

Para obtener el ultimo saldo realizo el siguiente select:

SELECT id_base, saldo_actual
FROM historial_saldos
WHERE id_base = 1
ORDER BY fecha DESC LIMIT 1

Sin problemas me devuelve el saldo inicial de la base con id 1

Pero ahora lo requiero para todas las bases en un select

SELECT
s.saldo_actual,
b.nombre_base
FROM
bases b
LEFT JOIN(
SELECT id_base, saldo_actual
FROM historial_saldos
ORDER BY fecha DESC LIMIT 1
) s ON s.id_base = b.id_base

En teoría debería devolverme el ultimo saldo, pero por lo visto al incluir un LIMIT 1 en la subconsulta, mysql me devuelve un solo registro para toda la consulta y no 1 para cada registro hallado en la tabla bases.

Cual seria la consulta adecuada?
  #2 (permalink)  
Antiguo 27/04/2012, 02:04
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Sub consulta en LEFT JOIN con LIMIT

Código MySQL:
Ver original
  1. SELECT id_base, max(fecha) as MFecha
  2. FROM historial_saldos
  3. GROUP BY id_base

Esto nos da la fecha maxima delos saldo de cada base.

Código MySQL:
Ver original
  1. SELECT hs.id_base, hs.saldo_actual
  2. FROM historial_saldos as  hs INNER JOIN
  3. (SELECT id_base, max(fecha) as MFecha
  4. FROM historial_saldos
  5. GROUP BY id_base) as Sbc
  6. ON hs.id_base=Sbc.id_base AND hs.fecha=Sbc.MFecha

Esto nos da el saldo que corresponde a la ultima fecha para cada base que tenga saldo

Código MySQL:
Ver original
  1. SELECT b.nombre_base, s.saldo_actual
  2.   FROM bases as b
  3.    LEFT JOIN (SELECT hs.id_base,
  4.                           hs.saldo_actual
  5.                         FROM historial_saldos as  hs
  6.                                   INNER JOIN
  7.                             (SELECT id_base,
  8.                                     max(fecha) as MFecha
  9.                                 FROM historial_saldos
  10.                               GROUP BY id_base) as Sbc
  11.                           ON hs.id_base=Sbc.id_base
  12.                                 AND hs.fecha=Sbc.MFecha) as s
  13. ON s.id_base = b.id_base

Esto nos da la lista completa de bases con saldo o sin el....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 27/04/2012, 08:41
Avatar de kivpson  
Fecha de Ingreso: marzo-2011
Mensajes: 37
Antigüedad: 13 años, 1 mes
Puntos: 7
Respuesta: Sub consulta en LEFT JOIN con LIMIT

Excelente amigo, gracias por la efectiva respuesta, había terminado el script con un bucle en php para sacar los resultados, pero obviamente no era lo indicado, millón gracias nuevamente.

Etiquetas: join, left, limit
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 17:30.