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:
- Determinar la disponibilidad de la propiedad.
- Determinar qué tarifas son aplicables para el rango de fechas proporcionado.
- 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.