KUROL3 3 Denunciar post Postado Maio 5, 2008 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
Paulo Caesar 0 Denunciar post Postado Maio 6, 2008 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
KUROL3 3 Denunciar post Postado Maio 6, 2008 Desculpa minha iguinorancia mas o que é SMALLINT... Marco Compartilhar este post Link para o post Compartilhar em outros sites
giesta 29 Denunciar post Postado Maio 6, 2008 roda sem a palavra 'OUTER' e ve quanto tempo demora Compartilhar este post Link para o post Compartilhar em outros sites
KUROL3 3 Denunciar post Postado Maio 6, 2008 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
Paulo Caesar 0 Denunciar post Postado Maio 6, 2008 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