Ir para conteúdo

POWERED BY:

Arquivado

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

KUROL3

Melhoria no Select

Recommended Posts

Olá no topico abaixo eu aprendi a dar um select e contar a quantidade de registros relacionado a outra tabela... ok ficou perfeito agora olha que engraçado nesse select

 

SELECT bairros.nome, bairros.id, count(imoveis.bairro) as total_bairro FROM bairros LEFT OUTER JOIN imoveis ON (bairros.nome = imoveis.bairro) GROUP by bairros.nome asc LIMIT 0, 20

TEMPO PARA ESSA CONSULTA: Mostrando registros 0 - 19 (20 total, Consulta levou 31.9990 segundos)

 

NESTE caso acabaou ficando inviável essa idéia gostaria de saber se há alguma sugestão ou forma di ferente.

 

DADOS ADICIONAIS

Tabela Bairros Total de Registros : 235

Tablea Imoveis Total de Registros: 8165

 

TENTEI ASSIM APRESENTOU O SEGUNTE ERRO

 

SELECT nome, (select bairro from imoveis where bairros.nome = imoveis.bairro) as total FROM `bairros` group by nome order by total desc

ERRO: #1242 - Subquery returns more than 1 row

 

 

Marco

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro, seria interessante você fazer um JOIN usando o ID do bairro, e não o nome dele (um unsigned SMALLINT por exemplo)

E fazer com que esse ID do bairro fosse sua PK (primary key)

Se fosse fizer um count(imoveis.id) ao invés de bairro (que acredito ser um varchar), vai deixar sua consulta muito mais rápida

Compartilhar este post


Link para o post
Compartilhar em outros sites

demora 25 segundos.. inviavel ainda...

 

quanto ao segundo exemplo você tem ideia pq apareceu aquele erro..::??

Compartilhar este post


Link para o post
Compartilhar em outros sites

unsigned smallint = inteiro de 0 a 65535

unsigned mediumint = inteiro de 0 a 16777215

 

SELECT bairros.nome, bairros.id, count(imoveis.bairro) as total_bairro FROM bairros LEFT JOIN imoveis ON (bairros.id = imoveis.bairro) ORDER BY bairros.nome ASC LIMIT 0, 20

 

Transforma seu imoveis.bairro em um "unsigned smallint" ou "unsigned mediumint". A sua database vai agradecer. e vai fazer as queries abaixo de 250ms, quase certeza, porque isso é uma consulta simplíssima. Lembre-se também dos índices na tabela. Coloque um índice no bairros.id e no imoveis.bairro (como smallint ou mediumint). E se não sabe o que são esses tipos de campo:

http://dev.mysql.com/doc/refman/4.1/pt/numeric-types.html

Lá no final

 

E a respeito do erro, você não pode fazer um select em uma subconsulta que dê mais de 1 linha de resultado.

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.