Ir para conteúdo

POWERED BY:

Arquivado

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

Chp

[Resolvido] Como listar o campo com mais dados repetidos

Recommended Posts

Olá amigos, bom dia.

 

Estou iniciando no php e estou tentando desenvolver um sistema de cadastro de links.

 

Criei o Banco de dados e tenho 3 tabelas, uma chamada Links, Categorias e outra chamada Visitas

 

Em links tenho:

id_link

cat_id

data

publicado

 

em Categorias tenho:

id

nome

 

em Visitas tenho:

idLink

ip

 

Então, funciona da seguinte forma: Sempre que a pessoa acessa o link cadastrado a pagina executa:

 

	if(mysql_num_rows($sql) <= '0'){
		mysql_query("INSERT INTO visitas (idLink,ip) VALUES ('$id_select','$ip')")or die(mysql_error());
	}

Até ai tudo bem, se o ip da pessoa ainda nao tiver sido registrado no banco, ele registra.

 

Eu estou apanhando aqui é para saber quando o link foi mais acessado, já tentei bolar alguma forma de pegar os dados e listar o que tiver mais ips cadastrados, no caso seria o campo idLink que tiver mais vezes repetido.

 

Ex:

idLink ip

2 10.0.116.5

52 10.0.116.6

55 10.0.116.2

55 10.0.116.7

55 10.0.116.11

55 10.0.116.12

55 10.0.116.13

43 10.0.116.8

6 10.0.116.9

29 10.0.116.10

 

Neste caso, o link de id 55 seria o mais visitado.

 

Mas como ficaria isso em <?php ?> ??

 

Agradeço desde já a ajuda e o tempo de vocês.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você quiser saber a quantidade de visitas, use essa query:

select idLink, COUNT(idLink) as nVisitas from visitas group by idLink order by nVisitas DESC;

o order by estava errado =(

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT * FROM `visitas` ORDER BY COUNT(`idLink`) DESC

Até mais

 

Olá H4x0R,

 

Obrigado pela rápida resposta.

 

Vou postar aqui, como esta exatamente a minha tabela e a query e o que esta retornando:

 

tabela

 idLink 	ip
	Editar 	Remover 	2 	::1
	Editar 	Remover 	52 	::1
	Editar 	Remover 	55 	10.0.116.2
	Editar 	Remover 	55 	::1
	Editar 	Remover 	43 	::1
	Editar 	Remover 	6 	::1
	Editar 	Remover 	29 	::1
	Editar 	Remover 	27 	::1
	Editar 	Remover 	26 	::1

query

						<?php				
							
							$sql_visitas_clicado  = "SELECT * FROM `visitas` ORDER BY COUNT(`idLink`) DESC " or die(mysql_error());
							$query_visitas_clicado = mysql_query($sql_visitas_clicado) or die(mysql_error());
							while ($linha=mysql_fetch_array($query_visitas_clicado)) {
								$visitas_clicado = $linha["idLink"];
								$ip_clicado = $linha["ip"];
							echo $visitas_clicado;
							}
                                                ?>

o echo está retornando "2", não era pra retornar "55" ??

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Se você quiser saber a quantidade de visitas, use essa query:

select idLink, COUNT(idLink) as nVisitas from visitas group by idLink order by qt DESC;

Essa não vai funcionar. Você está contando um agrupamento. ;)

 

Mas foi o que ele pediu...

Eu estou apanhando aqui é para saber quando o link foi mais acessado, já tentei bolar alguma forma de pegar os dados e listar o que tiver mais ips cadastrados, no caso seria o campo idLink que tiver mais vezes repetido.

xD

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah sim, pode usar o GROUP, mas acredito que a cláusula WHERE teria de ser alterada.

Quanto ao resultado "2", é por que ele agrupou o número de vezes que o registro é encontrado. Tente usar como o colega de cima falou, e se não funcionar, apenas altere a cláusula WHERE.

 

Até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Amigos,

 

Obrigado pelas respostas UltraFastMega Rapidas hehe;

 

Tentei o que o Daniloinf falou, ficou assim:

<?php				
							
   $sql_visitas_clicado  = "select idLink, COUNT(idLink) as nVisitas from visitas group by idLink order by idLink DESC LIMIT 0,1; " or die(mysql_error());
   $query_visitas_clicado = mysql_query($sql_visitas_clicado) or die(mysql_error());
   while ($linha=mysql_fetch_array($query_visitas_clicado)) {

   $visitas_clicado = $linha["idLink"];


   echo $visitas_clicado ;
}

?>

Retorna o 55. Perfeito! =)

 

Agora uma outra dúvida. Se possivel, claro.

 

Teria como implementar esta query, pra ela mostrar o link mais clicado de uma certa data, por exemplo:

 

O link mais clicado da tabela visitas etá sendo o 55, porem, porem, se eu quiser saber o mais clicado apenas da data de hoje, como ficaria esta query? eu teria que adicionar algo mais na tabela? é complicado? seria possível?

 

Obrigado mais uma vez pelas respostas;

Compartilhar este post


Link para o post
Compartilhar em outros sites

...

Teria como implementar esta query, pra ela mostrar o link mais clicado de uma certa data, por exemplo:

 

O link mais clicado da tabela visitas etá sendo o 55, porem, porem, se eu quiser saber o mais clicado apenas da data de hoje, como ficaria esta query? eu teria que adicionar algo mais na tabela? é complicado? seria possível?

 

Sim, basta adicionar um campo que marca a data da visita na tabela Visitas, ai você poderia buscar pela data com uma query mais ou menos assim:

 

select idLink, COUNT(idLink) as nVisitas from visitas where data = '$var_data' group by idLink order by idLink DESC LIMIT 0,1;

Tenta fazer ai, qualquer coisa agente te ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, para isso você precisará utilizar Sub-Querys, ou HAVING, ou melhorar essa cláusula WHERE.

 

Por exemplo: ... GROUP BY `idLink` HAVING DATEDIFF(`data`,DATE_FORMAT(NOW(), '%Y-%m-%d')) <= 30

 

Mas esse exemplo vai agrupar, porém não estará ordenado por data. Caso queira isso, utilize SubQuerys.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

...

Teria como implementar esta query, pra ela mostrar o link mais clicado de uma certa data, por exemplo:

 

O link mais clicado da tabela visitas etá sendo o 55, porem, porem, se eu quiser saber o mais clicado apenas da data de hoje, como ficaria esta query? eu teria que adicionar algo mais na tabela? é complicado? seria possível?

 

Sim, basta adicionar um campo que marca a data da visita na tabela Visitas, ai você poderia buscar pela data com uma query mais ou menos assim:

 

select idLink, COUNT(idLink) as nVisitas from visitas where data = '$var_data' group by idLink order by idLink DESC LIMIT 0,1;

Tenta fazer ai, qualquer coisa agente te ajuda

 

 

Ok, criei o campo, e mudei o INSERT do link.php, apaguei os registros da tabela visitas para zerar os clicks. cliquei nos links 52 a 57 com um ip e no 56 com outro ip,

 

entao a query mostraria o 56 pois tem 2 ips registrado, porem, esta mostando o 57, é como se a query estivesse mostrando sempre o ultimo registro da tabela visitas;

 

vou postar o codigo inteiro;

 

ao acessar o link.php?id=55

<?php
  if(is_numeric($_GET['id'])){
  $id_select = $_GET['id'];
  }else{
  $id_select = "2";
  }

$data_visita = date('d/m/Y');
$ip = $_SERVER['REMOTE_ADDR'];
	$sql = mysql_query("SELECT idLink, ip FROM visitas WHERE idLink='$id_select' AND ip='$ip'") or die(mysql_error());
if(mysql_num_rows($sql) <= '0'){
mysql_query("INSERT INTO visitas (idLink,ip,data_visita) VALUES ('$id_select','$ip', '$data_visita')")or die(mysql_error());
}
?>

Mostrando o mais clicado da data 20/10/2010

<?php				
$var_data = "20/09/2010";
$sql_visitas_clicado  = "select idLink, COUNT(idLink) as nVisitas from visitas where data_visita = '$var_data' group by idLink order by idLink DESC LIMIT 0,1;" or die(mysql_error());
$query_visitas_clicado = mysql_query($sql_visitas_clicado) or die(mysql_error());
while ($linha=mysql_fetch_array($query_visitas_clicado)) {
$visitas_clicado = $linha["idLink"];
$ip_clicado = $linha["ip"];
$mais_clicado = $visitas_clicado ;
}

$sql_clicado = "SELECT * FROM links WHERE nm_publicar='sim' AND id_link = '$mais_clicado'" or die(mysql_error());
$query_clicado = mysql_query($sql_clicado) or die(mysql_error());                                    
while ($linha=mysql_fetch_array($query_clicado)) {
$id_link_clicado = $linha["id_link"];
$nm_titulo_clicado = $linha["nm_titulo"];
$texto_clicado = $linha["nm_texto"];
$caminho_clicado = $linha['caminho'];
$data_clicado = $linha['nm_data']; //data que foi cadastrado e nao que foi clicado
$cat_id_clicado = $linha['cat_id'];
$link_clicado = $linha['nm_link'];
$publicado_clicado = $linha['nm_publicar'];
$titulo_clicado = utf8_encode($nm_titulo_clicado);			
					                                   
echo"						  				
<!--mais clicado -->
<div class='mais-clicado-txt-color'>do dia $data_clicado</div>
<div class='mais-clicado-img'><a href='link.php?id=$id_link_clicado'><img src='$caminho_clicado' alt='img-mais-clicado' width='207' heigth='102' /></a></div>
<div class='mais-clicado-txt'>$nm_titulo_clicado</div>
									  
<!---mais clicado-->
";
}
?> 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Claro amigo, veja bem esse ORDER. Eu disse que estaria incorreto.

Você está ordenando pelo MAIOR número idLink, até o menor.

 

Além disso esse where com uma data estipulada por uma função do PHP está meio fajuto.

 

GROUP BY `idLink` HAVING DATEDIFF(`data_visita`,DATE_FORMAT(NOW(), '%Y-%m-%d')) <= 30

Dessa forma ele adiciona ao agrupamento todos os idLink, onde a diferença da data_visita e a data atual seja menor ou igual a 30 (dias).

Pode-se mudar para 1, e fica o dia atual.

 

Ou ainda pode-se fazer de forma mais simples:

 

GROUP BY `idLink` HAVING DAYOFMONTH(`data_visita`) = DATE_FORMAT(NOW(), '%d')

Dica:

 

if(is_numeric($_GET['id'])){
  $id_select = $_GET['id'];
  }else{
  $id_select = "2";
  }

Troque por isso:

 

$id_select = ((int)$_GET['id']>0) ? (int)$_GET['id'] : 2;

Inté!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok Amigos,

 

Consegui aqui! agora ficou tudo certo, ainda estou fazendo algums testes, mas por enquanto esta tudo ok.

 

Muito obrigado pelo tempo e pela ajuda de voces.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ahh sim, claro, me desculpem;

 

 

A solução foi:

$sql_visitas_clicado  = "SELECT idLink, COUNT(idLink) AS nVisitas FROM visitas WHERE data_visita = '$var_data' GROUP BY idLink ORDER BY nVisitas DESC LIMIT 0,1" or die(mysql_error());

Mudei somente o ORDER BY

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.