Filtrar dados - MySQL - Portugal-a-Programar
By CloudPT, June 23, 2013 in MySQL
Eu tenho a tabela seguinte:
QuartosDisponiveis Data
2 2013-06-23
1 2013-06-25
0 2013-06-26
E quando um cliente inserir a sua data de entrada e a data de saida tem de aparecer se existe quarto ou não.
Fiz o seguinte select:
"SELECT * FROM Quartos WHERE (Entrada >= '$entrada' AND Entrada < '$saida' AND $nQuartos <= QuartosDisponiveis)";
O problema é quando eu digito o seguinte
Entrada 2013-06-23
Saida 2013-06-27
E não deveria aparecer nada pois no dia 2013-06-26 não existe quarto.
Eu pensei fazer o seguinte contar o numero de dias desde 23 até 27 (neste caso 5) e contar o numero de dias do resultado ( neste caso 4) caso não fossem iguais não listava (4 <> 5) mas, deve haver maneira mais simples.
Edited June 23, 2013 by CloudPT
"SELECT * FROM Quartos WHERE (Entrada >= '$entrada' AND Saida <= '$saida' AND $nQuartos <= QuartosDisponiveis)";
Penso que seja assim que querias que a query fosse feita..
Não essa é igual à que eu tenho em cima pois, imagine que eu quero reservar um quarto com entrada a 23-06-2013 e saida a 30-06-2013 e imagine que no dia 27 não tenho quartos disponiveis o que ia acontecer ? Ia listar os quarto todos que tem quartos do dia 23,24,25,26,28,29 mas, não listava o dia 27 o que é um problema o objectivo é caso isso aconteça não aparecer nenhum quarto. Percebeu ?
antes de mais, a tabela que tens não parece fazer sentido para o resultado que pretendes :
listar os quarto todos que tem quartos do dia 23,24,25,26,28,29
até porque a própria afirmação também não é a melhor que se pode pedir ...
estás a dizer que se queres mercar um quarto entre o dia X e o dia X+N, deverá aparecer todos os dias {X , ... , X+N}, se nenhum destes registos tiver o valor 0 na coluna "QuartosDisponiveis" ? e não listar nenhum caso contrário ?
Só existem 2 opções, lista ou não lista.
Lista caso o intervalo das datas de entrada e de saida não tiver nenhum '0' nos "QuartosDisponiveis".
Não Lista caso o intervalo das datas de entrada tiver um '0' nos "QuartosDisponiveis".
se isso é um trabalho académico, eu mandava o prof dar uma volta ao bilhar grande porque anda a ensinar más práticas de criação de base de dados.
se é um trabalho profissional, apagava tudo e fazia como deveria ser.
no entanto para resolver a tua situação, é processo será muito complicado, envolvendo sub-queries:
o que pretendes é conseguido desta forma:
from Quartos
where Data >= '$entrada'
and Data <= '$saida'
/* até aqui tudo pacífico */
/* agora necessitas de invalidar os registos caso exista um registo dentro das datas que tem o valor 0 na coluna "QuartosDisponiveis" */
and (select count(QuartosDisponiveis)
and QuartosDisponiveis = 0) = 0
Sou vou ter essa cadeira para o ano. Só queria treinar um pouco e assim ajudava um amigo que tem uma residencial, podia dar uma ajuda. Qual a maneira melhor para realizar o projecto?
Ele consiste numa reserva de quartos online tenho uma Tabela de Cliente e eu Tabela de Quartos Disponíveis.
ter uma tabela com "quartos disponíveis" não tem sentido, isto porque (pelo modelo apresentado)
- necessitas de ter 365 (366) registos por ano
- não tens qualquer tipo de informação que quarto individual que se encontra disponível
- não tens informação de quanto tempo um quarto individual se encontra indisponível
o que deverias ter seria uma tabela quartos que lista os quartos existentes e uma tabela reservas que guarda que quarto, cliente, e data inicial/data final da reserva