problema con consulta sql

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 FAQ problema con consulta sql tiene

Pertenece a la categoría:
Pregunta
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,

petergil
Respuesta de cephei
hola
mira 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 de la prop que quieres ver
Volver al árbol de categoríasVolver al árbol de categorías

Comentarios

PACO

04/8/2010
consulta sql
Yo en lugar del poner el id de la propiedad en la tabla de tarifas pondría un campo tipo_tarifa en la tabla de propiedades y en la de tarifas.
Con esto te evitas tener que crear una tarifa por cada propiedad y por cada periodo.
A cada propiedad le asignas un tipo_tarifa en en la tabla de tarifas defines los importes para ese tipo_tarifa por fechas (con esto varias propiedades pueden compartir las tarifas).

realizas la select haciendo join entre las tablas propiedad y tarifas y te retornará tantas filas como tarifas afectadas.
luego habrá que multiplicar en número de días que cubre de cada tarifa por el importe de la tarifa.

nbc

05/8/2010
idea
bueno yo mas o meno te puedo dar una idea pero no te aseguro que funcione ya que tiene tiempo que no manejo sql

propiedades (id_prop,descripcion,img,estado,propietario)
tarifas (id_tar, maxdias, mindias, preciopordia, validodesde, validohasta,id_prop)
reservas (id_res, diaentrada, diasalida, totaldias, totalreserva, estado, id_prop)


SELECT campos, (tendias que buscar una funcion en sql que te de los dias que hay entre una fecha y otra) as diasreserva,
entonces multiplicas (diasreserva *preciopordia) as totalprecio, con un if(diasreserva >mindias y diasreserva < maxdias, el periodo es valido, periodo invalido)

FORM reservas r, propiedades p left join tarifas t on p.id_prop = t.id_prop

WHERE p.id_prop = r.id_prop and r.estado <> 'ocupado'

el left join lo use por que te trae datos aunque en la tabla secundaria por asi decirlo no tenga datos

espero que te haya dado una idea

Johnny

05/8/2010
Rpta.
Primero tendria que identificar tu tabla principal que es bapp_propiedades (Id que es tu clave principal) enlazarla a tus otras dos tablas para realizar relaciones de 1 a *, ya que con esto podras tener varios caminos para poder resolver tu problema uno con uso de join, el segundo uso de subconsultas y el tercero uso del atributo union, dependiendo del Gestor de Base de Datos que uses, puedes hacer un procedimiento que te calcule eso por funcion o por store procedure. :P Johnny manya.pe
FAQ relacionadas
Volver al árbol de categoríasVolver al árbol de categorías