Ir para conteúdo

POWERED BY:

Arquivado

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

JoaoGusmao

[Resolvido] Ranking com dados de suas tabelas

Recommended Posts

TÍTULO SAIU ERRADO "DUAS TABELAS" OK?

Galera, no meu blog, estou fazendo uma parte onde tem o ranking com os artigos mais comentados. Esses artigos são vídeos. Tenho no BD a tabela "Videos" que contem a informação do vídeo, e a tabela "comentarios_videos", que tem os comentários. Tem uma coluna na tabela comentarios_videos, que é "id_video" que é correspondente ao id do artigo em que o comentário foi publicado.

Preciso fazer um ranking com os artigos mais comentados, e não sei como fazer, já que os comentários estão em uma tabela diferente dos videos. Alguém tem uma ideia?

 

EDIT: O título saiu errado :P é Duas tableas

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use UNION em duas selects diferentes.

Um detalhe, acho que qunado se usa UNION os nomes das colunas da sql terão que ser iguais.

 

Como, provavelmente, não serão iguais, você terá que usar apelidos (alias) na hora de fazer a sql.

 

tipo: select coluna1 as novoNOme from tabela1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Minhas tabelas são organizadas da seguinte forma:

comentarios_videos

id

id_video

nome

email

website

.... blá blá blá..

 

---------------

videos

id

titulo

descricao_rapida

conteudo

.... blá blá blá..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Me desculpe, minha resposta do Union não tem nada a ver.

 

talvez sua sql seja:

 

select v.id, v.titulo, count(c.id) from videos as v, comentarios_videos as c WHERE c.id_video=v.id GROUP BY c.id ORDER BY count(c.id)

 

Deve ser algo assim. Testa aí.

Vamo esperar outra pessoa ajudar também.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela resposta.

Adicionei este código.

Fiz um teste:

$consulta_top_comentarios = mysql_query("select v.id, v.titulo, count(c.id) from videos as v, comentarios_videos as c WHERE c.id_video=v.id GROUP BY c.id ORDER BY count(c.id)");
					while($linha_consulta_top_comentarios = mysql_fetch_array($consulta_top_comentarios)) {

					$id_top_comentarios = $linha_consulta_top_comentarios['titulo'];


					echo "$id_top_comentarios<br>";
					}

 

O resultado obtido foi:

POST 1

POST 1

POST 1

POST 2

POST 1

POST 1

.

Tenho 5 comentários no artigo POST 1, e 1 comentário no artigo POST 2.

Ainda o resultado não é o que eu quero.

Alguma ideia a mais?

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ops, o erro foi no meu group by ali (acho).

 

deveria ser GROUP BY v.id e não GROUP BY c.id

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para facilitar um pouco, criei um alias para o COUNT, mude a query para:

select v.id, v.titulo, count(c.id) as qnt from videos as v, comentarios_videos as c WHERE c.id_video=v.id GROUP BY c.id ORDER BY count(v.id)

 

E na hora de imprimir tudo, pode fazer assim:

$consulta_top_comentarios = mysql_query("select v.id, v.titulo, count(c.id) as qnt from videos as v, comentarios_videos as c WHERE c.id_video=v.id GROUP BY c.id ORDER BY count(v.id)");
                                               while($linha_consulta_top_comentarios = mysql_fetch_array($consulta_top_comentarios)) {

                                               $id_top_comentarios = $linha_consulta_top_comentarios['titulo'];
                                               $quantidade = $linha_consulta_top_comentarios['qnt'];



                                               echo $id_top_comentarios." - ".$quantidade." comentários<br>";
                                               }

 

Acho que é isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beleza galera, Funcionou direitinho. Mas agora, alguém poderia detalhar para min os códigos que me passaram?? Tipo, para que eu possa entender o que foi feito.

Vlw ae.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Explicando a SQL:

 

- select v.id, v.titulo, count(c.id) as qnt

Puxe os campos v.id, v.titulo e contagem de c.id (poderia ser count(v.id) ou count(*) que daria na mesma)

Apelidou o campo count(c.id) como qnt

 

- from videos as v, comentarios_videos as c

Puxe da tabela vídeos e comentarios_videos (colocando apelidos nelas, v para a tabela videos e c para a tabela comentarios_videos pra não precisar digitar toda hora)

 

- WHERE c.id_video=v.id

Puxe somente onde o campo id_video da tabela comentarios_videos FOR IGUAL ao campo id da tabela videos.

 

A sql acima irá gerar um monte de registro duplicado pois, matematicamente, unir duas tabelas duplica qtd_de_linhas_na_tabela1 x qtd_linhas_tabela2

 

Daí, usaremos o GROUP BY para agrupar os campos parecidos e fazer a contagem de comentários.

 

- GROUP BY v.id

Agrupe segundo o ID da tabela video. Como consequência, isso elimina os duplicados e faz o COUNT funcionar contando a quantidade de duplicados para cada v.id

 

- ORDER BY count(c.id)

Ordene segundo a quantidade de comentários de forma crescente

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.