> Faqs > Ayuda con consulta sql de reserva de propiedades al hacer joins entre tablas

Ayuda con consulta sql de reserva de propiedades al hacer joins entre tablas

Buenas, Ante todo, gracias por vuestra ayuda y tiempo y espero que me podais ayudar. Llevo un par de dias dandóle vueltas al tema para encontrar la mejor solución. Os explico:

Tengo 3 tablas definidas de la siguiente manera:

bapp_propiedades (id,descripcion,img,estado,propietario) 
bapp_tarifas (id, maxdias, mindias, preciopordia, validodesde, validohasta) 
bapp_reservas (id, diaentrada, diasalida, totaldias, totalreserva, estado) 

Donde la tabla bapp_propiedades guarda los apartamentos que existen, la tabla bapp_tarifas guarda las tarifas que cada apartamento tiene y cada uno de estos puede tener varias tarifas segun temporada alta o baja, fines de semana, etc... y estan definidas mediante un periodo de fechas y finalmente la tabla bapp_reservas que guarda un historial de reservas realizadas para cuando un cliente desee mirar la disponibilidad podamos consultar si es posible o no.

la cuestion es que mediante una consulta sql me gustaria calcular y mostrar las tarifas con el precio final teniendo en cuenta que:

  • en el rango de fechas que introduce el usuario pueden haber mas de una tarifa
  • las tarifas estan acotadas por un maximo i minimo de dias ademas del periodo de validez entonces aunqe este dispobible debe cumplir ese minimo o maximo de dias
  • las propiedades pueden estar reservadas para esas fecha (se debe comprobar en la tabla bapp_reservas) estoy abierto a otros posibles planteamientos para solucionar este problema...

asi que cualquier idea sera bienvenida :) habia pensado con un inner join pero la verdad es que no veo la luz. espero vuestras respuestas. un saludo a todos

Respuestas

A ver si te vale esta respuesta:

Lo que estás buscando puede ser resuelto mediante subconsultas y JOINs para conectar las tres tablas. Para simplificar el problema, lo dividiremos en pasos:

  1. Determinar la disponibilidad de la propiedad.
  2. Determinar qué tarifas son aplicables para el rango de fechas proporcionado.
  3. Calcular el precio final en función de las tarifas aplicables.

Vamos con el primer paso: Determinar la disponibilidad de la propiedad.

SELECT p.id
FROM bapp_propiedades p
WHERE NOT EXISTS (
    SELECT 1
    FROM bapp_reservas r
    WHERE r.diaentrada <= 'fecha_final' AND r.diasalida >= 'fecha_inicio'
    AND p.id = r.id
)

Con la consulta anterior, obtenemos las propiedades que no tienen reservas en el rango de fechas proporcionado (debes reemplazar 'fecha_inicio' y 'fecha_final' por las fechas que el usuario introduce).

El segundo paso es determinar qué tarifas son aplicables:

SELECT t.id
FROM bapp_tarifas t
WHERE (t.validodesde <= 'fecha_final' AND t.validohasta >= 'fecha_inicio')
AND (DATEDIFF('fecha_final', 'fecha_inicio') BETWEEN t.mindias AND t.maxdias)

Con la consulta anterior, obtenemos las tarifas que son aplicables en el rango de fechas proporcionado.

Finalmente, combinamos las consultas para obtener el precio final:

SELECT p.id, p.descripcion, SUM(t.preciopordia * DATEDIFF('fecha_final', 'fecha_inicio')) AS precio_final
FROM bapp_propiedades p
JOIN bapp_tarifas t ON p.id = t.id
WHERE NOT EXISTS (
    SELECT 1
    FROM bapp_reservas r
    WHERE r.diaentrada <= 'fecha_final' AND r.diasalida >= 'fecha_inicio'
    AND p.id = r.id
)
AND (t.validodesde <= 'fecha_final' AND t.validohasta >= 'fecha_inicio')
AND (DATEDIFF('fecha_final', 'fecha_inicio') BETWEEN t.mindias AND t.maxdias)
GROUP BY p.id, p.descripcion

Esta consulta final te proporcionará una lista de propiedades disponibles con el precio final basado en las tarifas aplicables. Debes reemplazar 'fecha_inicio' y 'fecha_final' por las fechas proporcionadas por el usuario.

Todo esto suponiendo que cada propiedad solo tiene una tarifa aplicable en un rango de fechas dado.

Alfonso
293 11 19 18

Primero debes tener en cuenta la relación que existe que existe entre tus identidades(Tablas), yo veo lo siguiente:

  • tabla de propiedades (las casas): esta tiene una relación de uno a varios, tanto con la tabla tarifas como con la tabla reservas, pues una propiedad puede tener varias tarifas como también puede tener varias reservas.

lo anterior nos dice que debemos tener un campo idPropiedad en la tabla propiedad (tu ya lo tienes).

Ahora, en las tablas reserva y tarifas si bien tienen un tienes un id, para identificar las registros de esas tablas, te falta agregar un campo donde vayas guardando el id de la propiedad a la que pertenece esa reserva o tarifa. eso es lo que ta va a permitir relacionar las tablas.

Ahora, cuando quieras ver por ejemplo una consulta que muestre las reservas de una propiedad deberás hacer lo siguiente:

SELECT aqui pones los campos que quieres mostrar de las tablas FROM bapp_reservas WHERE bapp_reservas.IdPropiedades = id 

(el ID es de la propiedad que quieres ver)

cephei