Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Diego Floripa!

2 meses sofrendo, Como vou fazer esse select, !

Recommended Posts

Boa Noite Gente,

 

 

Estou com um problema no select.

 

Vou tentar explicar:

 

Estou fazendo site de uma imobiliaria, tenho que fazer uma pesquisa entre dois periodos, e buscar somente imoveis que estão livres entre esse dois periodos que não esteja alugados no caso.

 

Por exemplo:

Quero alugar uma casa de 10/12/2008 à 20/12/2008, quero buscar no banco de dados somente os imoveis que estão LIVRES neste periodo, tudo bem, isso eu consegui fazer, só estão aparecendo imóveis que estão livres, o problema é que quando eu ponho dois periodos alugados do mesmo imovel no banco de dados.

 

No banco de dados adicionei os periodos que os imoveis estão alugados.

TABELA: periodoalugado

ID | CODIGO | INICIO | FIM

1 4001 2008/12/15 2008/12/25

2 4022 2008/04/11 2008/05/11

3 4027 2008/02/11 2008/03/11

4 4001 2008/05/11 2008/06/11

5 4005 2008/06/11 2008/07/11

...

Reparem que tem dois itens com o codigo 4001.

 

O select esta assim:

CODE
$sqlper2="SELECT codigo

FROM periodoalugado

WHERE periodoalugado.inicio < '2008-12-10' AND periodoalugado.fim < '2008-12-20' OR periodoalugado.inicio > '2008-12-10' AND periodoalugado.fim > '2008-12-20'

ORDER BY codigo ASC

GROUP by codigo

LIMIT ".$inicio.", ".$limite."";

$qryper2=mysql_query($sqlper2)or die("error no sql pesqU:".mysql_error()."<br><br>".$sqlper2);

$nrwper2=mysql_num_rows($qryper2);

$regper2=mysql_fetch_array($qryper2);

 

Se eu executar esse script, ele me retorna todos os CODIGOS.(Eu não queria que me retornasse o codigo 4001, porque ele no ID 1 ja foi alugado nesse periodo)

 

 

Mas como o codigo 4001 no ID 4 esta disponivel ele acaba me retornando.

 

O problema não esta nas datas, mas sim quando tem dois ou mais itens do mesmo codigo no banco de dados

 

Enfim, eu queria fazer o select, quando pegasse um codigo que ja estivesse alugado (exemplo o 4001), não selecionasse ele nos proximos IDs(exemplo do 4001 no ID 4), assim ele não me retornaria.

 

Deu para entender?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta isso:

 

$sqlper2="SELECT codigo
FROM periodoalugado
WHERE codigo <> 4001
AND (
   (periodoalugado.inicio < '2008-12-10' AND periodoalugado.fim < '2008-12-20')
   OR (periodoalugado.inicio > '2008-12-10' AND periodoalugado.fim > '2008-12-20')
)
ORDER BY codigo ASC
GROUP by codigo
LIMIT ".$inicio.", ".$limite."";
$qryper2=mysql_query($sqlper2)or die("error no sql pesqU:".mysql_error()."<br><br>".$sqlper2);
$nrwper2=mysql_num_rows($qryper2);
$regper2=mysql_fetch_array($qryper2);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá J.Filho,

 

O código rodou e não mostrou o codigo 4001, o problema é que tem mais codigos com esse mesmo "problema" que o 4001 tem, que tem duas ou mais datas, e ai acaba pegando os codigos que ja estão alugados e outra que não posso colocar no select o codigo que não quero que pegue no banco de dados, porque isso é relativo a cada pesquisa.

 

Lembrando que preciso colocar no site uma busca de imoveis disponiveis entre duas datas, os usuarios poem a data inicial e final que querem alugar e o banco de dados so retorna os códigos das casas que não estão alugados nessas datas que o usuario colocou o problema é que quando existe uma casa com dois periodos alugados, o select retorna esse codigo, porque existem dois periodos adicionados no banco de dados um que o select não pega que esta alugado, mas no outro o select acaba pegando porque não esta.

 

Entendeu?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Gente,

 

Estou com problema, meu select retorna um imovel que ja esta alugado.

 

Tenho no banco de dados os periodos em que os imoveis estão alugados/ocupados:

TABELA: periodoalugado

ID codigoID inicio fim

 

69 5001 2008/06/01 2008/06/15

70 5002 2008/06/01 2008/06/10

71 5003 2008/06/01 2008/06/10

72 5003 2008/06/15 2008/06/30

73 5004 2008/07/01 2008/07/16

76 5008 2008/06/10 2008/06/30

77 5008 2008/08/01 2008/08/08

78 5009 2008/06/23 2008/06/29

79 5011 2008/06/15 2008/06/25

 

Meu SELECT esta assim:

CODE
<?php

$sqlper2="SELECT codigoID

FROM periodoalugado

WHERE inicio < '2008-06-20' AND fim < '2008-06-20'

OR inicio > '2008-06-30' AND fim > '2008-06-30'

GROUP by codigoID

ORDER BY codigoID ASC

LIMIT ".$inicio.", ".$limite."";

$qryper2=mysql_query($sqlper2)or die("error no sql pesqU:".mysql_error()."<br><br>".$sqlper2);

$nrwper2=mysql_num_rows($qryper2);

$regper2=mysql_fetch_array($qryper2);

 

?>

 

No select o usuario do site quer alugar uma casa que esta disponivel no periodo que ele esta pedindo, tem que retornar do banco de dados os codigos dos imoveis que estão disponivel no período desejado, no exemplo deste select ele quer alugar do dia 2008-06-20 até 2008-06-30 (esses 10 dias).

 

Executando isso o CERTO era para o banco de dados retornar os seguintes codigos:

5001,5002,5004 e 5009 que estão disponiveis no periodo que o usuario quer.

 

Mas se eu executar o codigo php ele me retorna os codigos:

5001,5002,5003,5004,5008,5009.

 

OS CODIGOS 5003 E 5008 JA ESTÃO ALUGADOS e acaba me retornando.

 

Ele me retorna esses dois codigos porque nos IDs 71 e 77 estão disponiveis, esse é o problema, não queria que retornasse porque ja estão alugados.

 

Lembrando que preciso colocar no site uma busca de imoveis disponiveis entre duas datas, os usuarios poem a data inicial e final que querem alugar e o banco de dados so retorna os códigos das casas que não estão alugados nessas datas que o usuario colocou o problema é que quando existe uma casa com dois periodos alugados, o select retorna esse codigo, porque existem dois periodos adicionados no banco de dados um que o select não pega que esta alugado, mas no outro o select acaba pegando porque não esta.

 

Me ajudem.

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ja tentou usar o BETWEEN?

 

SELECT 2 BETWEEN 1 AND 10;

Outra coisa, essas datas ai estão num campo date?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diego,

 

acho que seu problema está na estrutura do seu BD. Quando postei a resposta deduzi que o campo Código representasse o status do imóvel. Pelo visto não é. Então você deve rever a estrutura do seu banco, pois você precisa determinar um campo que indique o status de acordo com suas necessidades.

 

Flws...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado por tentar me ajudar.

 

Bom, pelo que eu entendi você quer que eu faça um campo com status do imovel, se o status tiver 1 por exemplo esta alugado e se tiver 0 esta livre.

Se eu fizer assim como voce fala, vai dar a entender que a casa esta alugada o ano todo e não entre um periodo como é.

 

Eu quero fazer isso, mas com periodos, adiciono no banco de dados o inicio e o fim do periodo que a casa esta alugada,

porque quero assim? porque a casa pode estar alugada do dia 01/06 à 10/06, mas depois e antes esta livre se o usuario que esta no site fazer a pesquisa por imoveis livres.

 

Alguem tem algum exemplo? ou então possa montar uma outra forma para resolver meu problema?

Ja procurei muito, muito e não achei nada semelhante.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu problema eh falta de vodka.... e um banco meio que mal elaborado, mas beleza.....

 

 

Em vez de escolher quais estao livres você tem que ver quais NAO estao livres e excluilos da lista

 

 

Select * from periodoalugado where codigo NOT IN

(

Select codigo

from

periodoalugado

where

( ($inicio_aluguel BETWEEN INICIO AND FIM or $fim_aluguel BETWEEN INICIO AND FIM ) or ($inicio_aluguel < INICIO AND $fim_aluguel > FIM) )

)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.