Obtener el valor maximo de un campo, a partir de una serie de registros. MYSQL

publicado por: Anonymous

La consulta es la siguiente, se tienen 2 tablas:

Pagos                             
-idPago                                
-idCliente                             
-fechaEnQuePaga                        
-fechaVencimiento    
Cliente
-idCliente
-nombre
-apellidoPaterno
-apellidoMaterno
-correo

idCliente es llave foránea.
Suponiendo que las tablas tienen los siguientes datos:

Tabla Pagos:

1 | 1 | 2018-02-23 | 2018-03-23
2 | 2 | 2018-02-23 | 2018-05-23
3 | 2 | 2018-02-23 | 2018-06-23
4 | 1 | 2018-04-23 | 2018-07-23

Tabla Clientes:

1 | Daniel | Sosa  | Estrada | [email protected]
2 | Juan   | Casas | Sola    | [email protected]

Y quiero obtener los datos del cliente, seguido de los datos de su pago pero, con al fecha de vencimiento más lejana, esperando obtener:

1 | Daniel | Sosa  | Estrada | 2018-04-23 | 2018-07-23
2 | Juan   | Casas | Sola    | 2018-02-23 | 2018-06-23

Tengo un query, que se asemeja pero no me da los resultados esperados:

SELECT
    cliente.idcliente,
    nombre,
    apellidoPaterno,
    apellidoMaterno,
    fechaEnQuePaga,
    fechavencimiento
FROM cliente, pagos
WHERE (cliente.idcliente = pagos.idcliente)
GROUP BY idcliente;

Resultado:

1 | Daniel | Sosa  | Estrada | 2018-02-23 | 2018-03-25
2 | Juan   | Casas | Sola    | 2018-02-23 | 2018-05-23

Noté que si agrego MAX() me localiza la fecha a vencer más lejana, pero no muestra su fecha de pago correspondiente:

SELECT
    cliente.idcliente,
    nombre,
    apellidoPaterno,
    apellidoMaterno,
    fechaEnQuePaga,
    MAX(fechavencimiento)
FROM cliente, pagos
WHERE (cliente.idcliente = pagos.idcliente)
GROUP BY idcliente;

Resultado:

1 | Daniel | Sosa  | Estrada | 2018-02-23 | 2018-07-25
2 | Juan   | Casas | Sola    | 2018-02-23 | 2018-06-23

La fecha de pago no corresponde a la de la fila.

Agradezco su respuesta.

solución

Las funciones ventana son ideales para este tipo de consulta, pero MySQL no las tiene 🙁

Lo que puedes hacer es un join normal (o un left join si es posible que un cliente no tenga pagos), pero agregarle una subconsulta correlativa que filtra los resultados por MAX(fechavencimiento):

select c.idcliente,
       c.nombre,
       c.apellidoPaterno,
       c.apellidoMaterno,
       p.fechaEnQuePaga,
       p.fechavencimiento
  from cliente c
  left join pagos p
    on p.idcliente = c.idcliente
   and p.fechavencimiento = (select max(p2.fechavencimiento)
                               from pagos p2
                              where p2.idcliente = p.idcliente)

Advertencia: Si un cliente puede tener valores fechavencimiento duplicados en la tabla pagos, entonces existe la posibilidad que esta consulta te devuelva más de un registro por cliente.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *