COMO SIMPLIFICAR CONSULTA MUITO COMPLEXA?
MARSOLIM,
Beleza! Acho que faltam uns campos também, mas não são importantes.
Desta forma facilita para o Fabiano Couto ou qualquer outro amigo ajudar também.
Importante:
Na base de dados que disponibilizei acima precisa cadastrar também para o apartamento no Pacaembu dentro da tabela [Ô]Cômodos[Ô]:
- a garagem;
- a suÃte;
... sem não cadastrar não traz o resultado (do jeito que você quer) ... acho que a sua query está certinha.
[][ô]s,
Tunusat.
Beleza! Acho que faltam uns campos também, mas não são importantes.
Desta forma facilita para o Fabiano Couto ou qualquer outro amigo ajudar também.
Importante:
Na base de dados que disponibilizei acima precisa cadastrar também para o apartamento no Pacaembu dentro da tabela [Ô]Cômodos[Ô]:
- a garagem;
- a suÃte;
... sem não cadastrar não traz o resultado (do jeito que você quer) ... acho que a sua query está certinha.
[][ô]s,
Tunusat.
Cheguei a essa query. Trouxe apenas o apartamento. Mas precisa testar com uma base de dados maior.
Como pode ver, apenas um relacionamento entre as tabelas imóveis e cômodos e a ordem das tabelas foi invertida para não haver necessidade de vários joins.
Veja que os campos da tabela cômodos utilizam o operador IN que vai satisfazer a mais critérios ao mesmo tempo.
A query acima tem um bug em relação a lógica que o amigo precisa, mas na maioria dos casos vai trazer os registros corretos.
Quem descobrir o bug vai ganhar um doce .
SELECT i.CodImovel, i.bairro
FROM comodos AS c
INNER JOIN imoveis AS i ON c.CodImovel = i.CodImovel
WHERE (i.tipo = [ô]apartamento[ô])
AND (i.bairro = [ô]pacaembu[ô])
AND (c.qtd IN (1, 2))
AND (c.tipo IN ([ô]quarto[ô], [ô]suite[ô], [ô]garagem[ô]));
Como pode ver, apenas um relacionamento entre as tabelas imóveis e cômodos e a ordem das tabelas foi invertida para não haver necessidade de vários joins.
Veja que os campos da tabela cômodos utilizam o operador IN que vai satisfazer a mais critérios ao mesmo tempo.
A query acima tem um bug em relação a lógica que o amigo precisa, mas na maioria dos casos vai trazer os registros corretos.
Quem descobrir o bug vai ganhar um doce .
ffcouto eu havia tentado algo semelhante com a clausula IN. o problema é que pelo menos para mim não associou a sequência dos parametros entre os dois INs e por isso ao invés de pesquisar por exemplo 2 quarto, 1 suite e 1 garagem retornava qualquer registro aonde tivesse 2, 1 e 1 e aonde tivesse quarto, suite e garagem sem levar em conta se estavam na mesma linha na sequência entre os dois INs. talvez tenha sido a forma que fiz. e havia tentado invertendo a ordem das tabelas também. mas está funcionando muito bem do jeito que mencionei na mensagem anterior. a consulta praticamente instantanea pelo menos enquanto está com pouco mais de 80 mil registros.
MARSOLIM, você acertou o bug que eu mencionei.
Você teria uma outra alternativa utilizando o UNION. Dessa forma, você teria várias consultas simples e a geração delas via código seria simplificada.
Segue um exemplo.
Espero que te ajude.
Você teria uma outra alternativa utilizando o UNION. Dessa forma, você teria várias consultas simples e a geração delas via código seria simplificada.
Segue um exemplo.
SELECT i.CodImovel, i.ID, i.vendedor, i.cadastrador, i.data_cadastro, i.hora_cadastro, i.tipo, i.area, i.valor, i.cep, i.Cidade, i.estado, i.endereco, i.numero, i.bairro
FROM comodos AS c
INNER JOIN imoveis As i ON i.CodImovel = c.CodImovel
WHERE (i.tipo = [ô]apartamento[ô])
AND (i.bairro = [ô]pacaembu[ô])
AND (c.qtd = 2)
AND (c.tipo = [ô]quarto[ô])
UNION ALL
SELECT i.CodImovel, i.ID, i.vendedor, i.cadastrador, i.data_cadastro, i.hora_cadastro, i.tipo, i.area, i.valor, i.cep, i.Cidade, i.estado, i.endereco, i.numero, i.bairro
FROM comodos AS c
INNER JOIN imoveis As i ON i.CodImovel = c.CodImovel
WHERE (i.tipo = [ô]apartamento[ô])
AND (i.bairro = [ô]pacaembu[ô])
AND (c.qtd = 1)
AND (c.tipo = [ô]suite[ô])
UNION ALL
SELECT i.CodImovel, i.ID, i.vendedor, i.cadastrador, i.data_cadastro, i.hora_cadastro, i.tipo, i.area, i.valor, i.cep, i.Cidade, i.estado, i.endereco, i.numero, i.bairro
FROM comodos AS c
INNER JOIN imoveis As i ON i.CodImovel = c.CodImovel
WHERE (i.tipo = [ô]apartamento[ô])
AND (i.bairro = [ô]pacaembu[ô])
AND (c.qtd = 1)
AND (c.tipo = [ô]garagem[ô])
Espero que te ajude.
ffcouto será que usando union all a consulta não ficaria mais lenta? digo porque nesse caso se eu pesquisar por 10 tipos de comodos estarei incluindo os campos de imoveis 10 vezes e do modo que fiz os campos de imoveis são incluÃdos uma vez só. no momento não estou com muito tempo para testar. mesmo assim agradeço por partilhar esse método. uma hora com mais tempo vou fazer uns testes para ver.
bem galera dou o tópico por encerrado. agradeço a todos que opiniaram sobre o caso.
Tópico encerrado , respostas não são mais permitidas