COMO SIMPLIFICAR CONSULTA MUITO COMPLEXA?

TUNUSAT 11/11/2014 13:04:14
#442426
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.
FFCOUTO 11/11/2014 16:23:46
#442432
Cheguei a essa query. Trouxe apenas o apartamento. Mas precisa testar com uma base de dados maior.

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 .
MARSOLIM 11/11/2014 18:36:31
#442437
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.
FFCOUTO 12/11/2014 09:07:43
#442443
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.

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.
MARSOLIM 19/11/2014 16:23:42
#442635
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.
MARSOLIM 28/11/2014 14:05:43
#442851
bem galera dou o tópico por encerrado. agradeço a todos que opiniaram sobre o caso.
Página 2 de 2 [16 registro(s)]
Tópico encerrado , respostas não são mais permitidas