entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Tengo dos tablas: una clientes y otra de reservas.
En clientes tengo el campo id_cliente y en reservas se almacena el id_cliente y fecha_reserva.

Necesito sacar de la consulta, todos los clientes que no hayan realizado ninguna reserva en más de 3 años.

Es decir, puedo tener 3 reservas de un cliente una de este año, otra de la anterior, y una última de más de 3 años. En este caso no me mostraría ningún dato porque la más reciente es la de este año.

¿Algún consejo?

Muchas gracias!

1 Respuesta

2votos

magarzon Puntos30650

Esta es la query que necesitas:

SELECT c.id_cliente, max(r.fecha_reserva) as ultima FROM clientes c JOIN reservas r on r.id_cliente = c.id_cliente group by c.id_cliente having ultima < date_sub(curdate(), interval 3 year)

Un poco de explicación:

Con la función de agregación max consigues el valor máximo de ese campo, pero como lo quieres para cada usuario, tienes que usar el group by. Y como es un campo calculado a partir de una función de agregación, tienes que usar HAVING en lugar de WHERE.

Luego para obtener la fecha de 3 años antes, tienes varias opciones, la que te pongo aquí funciona para MySQL al menos.

0voto

danielreales7 comentado

Mil gracias por la ayuda, funciona correctamente.

¿Existe algún método para simplificar la consulta cuando tienes millones de registros? Entiendo que al hacer la función date_sub(curdate(), INTERVAL 7 YEAR) por todos los usuarios, aumenta el tiempo de ejecución de la consulta.

Muchas gracias por todo y un saludo!

0voto

magarzon comentado

Para empezar, tendrías que establecer un índice sobre el campo fecha_reserva.

Si con esto no es suficiente, ya tendrías que ir a otras soluciones, como utilizar "tablas de agregación": cada x tiempo haces esta consulta o una parecida, y el resultado lo almacenas en una tabla, y luego la consulta final la realizas sobre esa otra tabla, que tendrá muchos menos registros. Por ejemplo, puedes hacer una consulta de los que sí han hecho una operación en los últimos 7 años, y luego buscar solo por los id de cliente que no están en esa tabla. Lo que pasa es que esto te puede limitar el que puedas cambiar el periodo de tiempo, aunque se puede llegar a hacer pensando bien qué vas a guardar en tu tabla agregada.

0voto

danielreales7 comentado

Genial! Muchísimas gracias por todo, me ha servido para reducir algo más.

Un saludo.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta