Jump to content
Baia

[Resolvido] Retornar quartos que não estão ocupados

Recommended Posts

Baia

Boas alguém me pode ajudar aqui com uma query?? :)

basicamente queria retornar os quartos que estão livres para um determinado intervalo de datas.

tenho estas 3 tabelas, e queria que ao passar duas datas me fosse retornado o id dos espaços que não estão ocupados entre essas datas(penso que o esquema relacional seja correto)

63202272.png

com esta query,

SELECT id FROM espacos WHERE NOT EXISTS (SELECT id_espaco
FROM espacos_reservados WHERE id_espaco = espacos.id)

retorna os espacos que não estão nos" espacos_reservados", mas agora falta as datas(que estão na outra tabela, "estadias") :confused:

obrigado ;)

Share this post


Link to post
Share on other sites
HappyHippyHippo

achas que consegues fazer o inverso ?

- saber os espaços que tem reservas dentro de duas datas pré-determinadas


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Baia

o inverso é igual ao que quero fazer, apenas trocando os operadores e as condições

Share this post


Link to post
Share on other sites
HappyHippyHippo

eu não perguntei o que é o inverso, eu perguntei se sabes fazer ...

(o português é língua assim tão difícil ?)


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Baia

Ora sabendo interpretar o português,

já que são os dois idênticos, se não sei fazer um, também não sei fazer o outro ;)

Share this post


Link to post
Share on other sites
HappyHippyHippo

já que são os dois idênticos, se não sei fazer um, também não sei fazer o outro ;)

não são idênticos, logo A não implica B.

cria então este SQL :

lista todas as entradas de "estadias" que se encontram registadas dentro de duas datas pré-determinadas


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Baia

penso que seja isto:

SELECT
estadias.*
FROM estadias
WHERE estadias.data_inicio BETWEEN DATE(2013 - 05 - 27) AND DATE(2013 - 05 - 30) OR estadias.data_fim BETWEEN DATE(2013 - 05 - 27) AND DATE(2013 - 05 - 30)

retorna se a data de fim ou de inicio se encontrar entre as datas especificadas

Edited by Rui Carlos

Share this post


Link to post
Share on other sites
HappyHippyHippo

quase:

SELECT *
 FROM estadias
WHERE data_inicio <= '2013-05-30'
  AND data_fim >= '2013-05-27'

(ps : se o tipo de dados dos campos 'data_fim' e 'data_inicio' forem correctos)

achas que consegues adicionar SQL para relacionar a tabela "espacos_reservados" de modo a ter os id's dos espaços ?

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Baia

SELECT
espacos_reservados.id_espaco
FROM espacos_reservados
INNER JOIN estadias
ON espacos_reservados.id_estadia = estadias.id
WHERE estadias.data_inicio <= '2013-05-30' AND estadias.data_fim >= '2013-05-27'

certo?

Share this post


Link to post
Share on other sites
HappyHippyHippo

sim

agora é só usar isso como o subquery do query apresentada no teu primeiro post


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Baia

hum, assim?

SELECT id FROM espacos WHERE NOT EXISTS (SELECT
espacos_reservados.id_espaco
FROM espacos_reservados
INNER JOIN estadias
ON espacos_reservados.id_estadia = estadias.id
WHERE estadias.data_inicio <= '2013-05-30' AND estadias.data_fim >= '2013-05-27')

os as datas são do tipo "data"

Edited by brunoais
geshi

Share this post


Link to post
Share on other sites
HappyHippyHippo

agora experimenta na tua base de dados (com datas apropriadas)


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Baia

hum... o select funciona(retorna o id do espaço que se encontra registado dentro das duas datas)

agora como subquery não está a retornar nada :confused: .

Share this post


Link to post
Share on other sites
HappyHippyHippo

estranho ... e o not in ?

SELECT id
 FROM espacos
WHERE id not in (SELECT id_espaco
                   FROM espacos_reservados INNER JOIN estadias ON espacos_reservados.id_estadia = estadias.id
                  WHERE data_inicio <= '2013-05-30'
                    AND data_fim >= '2013-05-27')

Edited by HappyHippyHippo
  • Vote 1

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Baia

estranho ... e o not in ?

SELECT id
 FROM espacos
WHERE id not in (SELECT id_espaco
				FROM espacos_reservados INNER JOIN estadias ON espacos_reservados.id_estadia = estadias.id
			   WHERE data_inicio <= '2013-05-30'
				 AND data_fim >= '2013-05-27')

:thumbsup: perfeito.

Muito obrigado pela disposição

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.