Ir para conteúdo
Fórum Script Brasil
  • 0

Contador de registros repetidos


wagtel

Pergunta

Olá pessoal

Estou tentando criar um recordset para contar os registros repetidos no campo id_bairro da tabela cadastros

Ou seja, quantos endereços existem em cada bairro

SELECT DISTINCT id_bairro
FROM cadastro
GROUP BY id_bairro_tax
HAVING id_bairro_tax > 1

Mas este recordset apenas me dá apenas a quantidade de bairros únicos

Veja o exemplo em http://www.wagtel.com/projeto/bairros_2.php?Estado=26&Cidade=9668

Fiz uma busca no Google e encontrei o código mais ou menos assim:

SELECT COUNT ( id_bairro_tax)
FROM cadastro
GROUP BY id_bairro_tax
HAVING COUNT ( id_bairro_tax) > 1

Mas a página dá o erro: FUNCTION tacapi_taxis.COUNT does not exist

Alguém pode me dar uma luz quanto à este problema?

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

O seu primeiro exemplo está quase correto, só falta um detalhe no HAVING, que deveria ser assim:

SELECT DISTINCT id_bairro
FROM cadastro
GROUP BY id_bairro_tax
HAVING COUNT(id_bairro_tax) > 1

Da forma como você fez "HAVING id_bairro_tax > 1" ele vai aceitar todos os registros que tenham o VALOR do campo id_bairro_tax maior que 1 e não a CONTAGEM.

E no segundo exemplo o problema é o espaço entre "COUNT" e o "(".

Espero ter ajudado.

Tudo de bom.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Markus:

De fato, fiz as correções no código e até deu certo, ficou assim:

SELECT COUNT( id_bairro_tax)
FROM taxis_cadastro
GROUP BY id_bairro_tax
HAVING COUNT(id_bairro_tax) > 0

Quando texto ele no Dreamweaver ele me dá exatamente a quantidade de endereços que cada bairro tem.

Mas na página bairros_2.php, ele me dá apenas o total de bairros repetidos

o código que uso na página é:

<?php echo $totalRows_Contador ?>

Tentei um outro geito que até funciona, com <Iframe> onde é enviado o id_bairro_tax de cada bairro, e ele devolve a quantidade exata.

Mas fica ruim por que o width do <iframe> não é flexível

Veja os exemplos na página:

http://www.wagtel.com/projeto/bairros_2.php?Estado=26&Cidade=9668

Como faço para conseguir este resultado sem ter que usar <iframe> ?

Editado por wagtel
Link para o comentário
Compartilhar em outros sites

  • 0
Entendi.
Pra ter certeza eu precisaria ver o código completo da página bairros_2.php e talvez da página bairros_2_iframe_intro.php, para comparar.
Mas acredito que na página bairros_2_iframe_intro.php você está fazendo da maneira correta pegando o valor retornado pelo sql, algo do tipo.
<?php
$resultado = mysql_query('SELECT COUNT(id_bairro_tax) FROM taxis_cadastro WHERE id_bairro_tax = 48595 GROUP BY id_bairro_tax HAVING COUNT(id_bairro_tax) > 0');
$totalRows_Contador = mysql_fetch_row($resultado);
echo $totalRows_Contador[0];
?>

Já na página bairros_2.php das duas uma ou você está contanto a quantidade de registros retornados pela consulta, ou você está pegando o valor da primeira linha e escrevendo ele novamente para todos os itens, tipo:

<?php
$bairros = mysql_query(/*SELECT DOS BAIRROS*/);
$resultado = mysql_query('SELECT COUNT(id_bairro_tax) FROM taxis_cadastro GROUP BY id_bairro_tax HAVING COUNT(id_bairro_tax) > 0');
$totalRows_Contador = mysql_fetch_row($resultado);
while ($bairro = mysql_fetch_assoc($bairros)) {
	echo '<a href="...">'.$bairro['nome'].' - '.$totalRows_Contador[0].'</a>';
}
?>
OU
<?php
$bairros = mysql_query(/*SELECT DOS BAIRROS*/);
$resultado = mysql_query('SELECT COUNT(id_bairro_tax) FROM taxis_cadastro GROUP BY id_bairro_tax HAVING COUNT(id_bairro_tax) > 0');
while ($row = mysql_fetch_row($resultado) {
	$rows[] = $row;
}
$totalRows_Contador = count($rows);
while ($bairro = mysql_fetch_assoc($bairros)) {
	echo '<a href="...">'.$bairro['nome'].' - '.$totalRows_Contador.'</a>';
}
?>
OU
<?php
$bairros = mysql_query(/*SELECT DOS BAIRROS*/);
$resultado = mysql_query('SELECT COUNT(id_bairro_tax) FROM taxis_cadastro GROUP BY id_bairro_tax HAVING COUNT(id_bairro_tax) > 0');
$totalRows_Contador = mysql_num_rows($resultado);
while ($bairro = mysql_fetch_assoc($bairros)) {
	echo '<a href="...">'.$bairro['nome'].' - '.$totalRows_Contador.'</a>';
}
?>

Quando o certo seria algo do tipo:

<?php
$bairros = mysql_query(/*SELECT DOS BAIRROS*/);
while ($bairro = mysql_fetch_assoc($bairros)) {
	$resultado = mysql_query('SELECT COUNT(*) FROM taxis_cadastro WHERE id_bairro_tax = '.$bairros['id']);
	$totalRows_Contador = mysql_fetch_row($resultado);
	echo '<a href="...">'.$bairro['nome'].' - '.$totalRows_Contador[0].'</a>';
}
?>

Repare que a consulta que conta a quantidade de endereços de cada bairro está mais curta, porque a clausula HAVING só serve para filtrar os registros retornados, como se fosse uma segunda clausula WHERE, exemplo:

Você uma tabela de cadastro de produtos e alguns estagiario duplicou parte dos produtos você precisa de uma lista dos produtos duplicados logo você precisa de uma consulta assim:

SELECT nome FROM produtos GROUP BY nome HAVING count(*) > 1

Onde você retorna o nome do produto agrupando por nomes iguais, mas FILTRANDO com HAVING e exibindo apenas os registros com mais de uma repetição

No seu caso:

SELECT COUNT(id_bairro_tax) FROM taxis_cadastro GROUP BY id_bairro_tax HAVING COUNT(id_bairro_tax) > 0

Você não está filtrando nada com o HAVING então ele pode ser excluído:

SELECT COUNT(id_bairro_tax) FROM taxis_cadastro GROUP BY id_bairro_tax 

E quando você usa o COUNT() automaticamente o sql faz um GROUP BY então o GROUP BY é desnecessário

SELECT COUNT(id_bairro_tax) FROM taxis_cadastro
Editado por Markus Magnus
Link para o comentário
Compartilhar em outros sites

  • 0

Agora entendi minha dificuldade:

Eu criei dois recordset:

SELECT DISTINCT - Este me retorna todos os bairros (sem repetir)

e

SELECT COUNT - Este me retorna a quantidade de bairros (por grupo) Ex: de 1 até infinito

Quando uso o loper (repetir a região) para apresentar as listagens de bairros (na página) estou usando o SELECT DISTINCT

Daí o SELECT COUNT apresenta apenas o valor da contagem do primeiro grupo, no caso (4)

Pensei então em unir estes dois recordsets:

SELECT id_bairro_tax, bairro_tax, COUNT( * ) AS count
FROM `taxis_cadastro`
GROUP BY id_bairro_tax
HAVING COUNT(id_bairro_tax) > 0

Desta forma eu consegui unir DISTINCT e COUNT recebenddo também os parâmetros:

<?php echo $row_TaxisResult['id_bairro_tax']; ?>(como campo)

<?php echo $row_TaxisResult['bairro_tax']; ?>(como campo)

<?php echo $row_TaxisResult['count']; ?> (como o contador de registros repetidos)

Mas o problema ainda estava no filtro para id_estado_tax e id_cidade_tax

Penei um pouco para encontrar o lugar certo para o WHERE, mas encontrei.

SELECT id_bairro_tax, bairro_tax, COUNT( * ) AS count
FROM `taxis_cadastro`
WHERE id_estado_tax = colname AND id_cidade_tax = var
GROUP BY id_bairro_tax
HAVING COUNT(id_bairro_tax) > 0
ORDER BY bairro_tax ASC

Pronto, consegui exatamente o que precisava.

Agradeço muito à todos e ao Markus Magnus pela força.

Editado por wagtel
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...