Ir para conteúdo

POWERED BY:

Arquivado

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

nicholaskr

Ordenar tópicos por comentários

Recommended Posts

Olá pessoal. Criei um fórum basico para meu site. Elas estão ordenadas por id, no qual vão postando vão aparecendo em primeiro, mas gostaria de fazer tipo assim. Se um usuário comentar em um tópico antigo que não está aparecendo mais na página inicial, ao comentar ele volta para a página principal. O que quero é ao invés de ordenar por id, ordenar por comentarios.

 

Eu criei duas tabelas, a tabela topicos e a tabelas topicos_comentarios, abaixo está o código que usei para exibir.

$sql = "SELECT * FROM topicos WHERE status='Ativo' AND fixo='nao' ORDER BY id DESC";

 

espero que possam me ajudar, se alguem souber apenas edite este meu acima. Obrigado desde já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

tenta ai

order by comentarios,id

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi amigo!

 

Já passei por isso, e eu resolvi assim:

 

Na tabela de topicos, cria uma coluna tipo "data_da_ultima_atualizacao", aonde quando alguem responde ao topico, voce dá um update nele (UPDATE topicos SET data_da_ultima_atualizacao='".date("Ymdhis")."' WHERE id='$id_do_topico')

 

Depois é só organizar por data_da_ultima_atualizacao DESC que ele faz o trabalho sozinho organizando por data da ultima atualização.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que o amigo Gildonildo sugeriu é uma solução viável. Você poderia usar INNER JOIN, entretanto imagine que um novo artigo não tenha comentários, quando fizesse o INNER JOIN daria erro, e além do mais, o select teria que ser nos comentários dando o INNER JOIN no artigo referente ao mesmo, portanto siga a dica do amigo Gildonildo.

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

tenta um inner join pesquisa no google isso

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi amigo!

 

Já passei por isso, e eu resolvi assim:

 

Na tabela de topicos, cria uma coluna tipo "data_da_ultima_atualizacao", aonde quando alguem responde ao topico, voce dá um update nele (UPDATE topicos SET data_da_ultima_atualizacao='".date("Ymdhis")."' WHERE id='$id_do_topico')

 

Depois é só organizar por data_da_ultima_atualizacao DESC que ele faz o trabalho sozinho organizando por data da ultima atualização.

Se a modelagem do banco estiver correta esta solução, se for levado em conta que o banco de dados é relacional, pode ser chamada no máximo de gambiarra... um join (left/right) resolveria o problema, no máximo precisaria de um distinct/max.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Se a modelagem do banco estiver correta esta solução, se for levado em conta que o banco de dados é relacional, pode ser chamada no máximo de gambiarra... um join (left/right) resolveria o problema, no máximo precisaria de um distinct/max.

 

Errado.

 

A solução é perfeitamente válida, além de ser mais veloz, porque não haverá busca em mais de uma tabela. Para facilitar, você pode fazer o uso de um trigger que atualize automaticamente a tabela com os tópicos:

 

DELIMITER $;
CREATE TRIGGER comentario_update_topico
AFTER INSERT ON comentarios
FOR EACH ROW
BEGIN
UPDATE topicos set data_hora_ultimo_comentario = new.data_hora_comentario WHERE id = new.topico_id;
END$
DELIMITER ;

 

Edit: só para esclarecer, a grosso modo, new representa a tabela comentários, mais precisamente, o registro que acabou de ser inserido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Errado.

 

A solução é perfeitamente válida, além de ser mais veloz, porque não haverá busca em mais de uma tabela. Para facilitar, você pode fazer o uso de um trigger que atualize automaticamente a tabela com os tópicos:

Perfeitamente aceitável? Até entendo que existam vários meios de se chegar ao mesmo caminho, agora institucionalizar a gambiarra...

Compartilhar este post


Link para o post
Compartilhar em outros sites
Perfeitamente aceitável? Até entendo que existam vários meios de se chegar ao mesmo caminho, agora institucionalizar a gambiarra...

Sério cara, me explica por que isso é uma gambiarra.

 

Você nunca ouviu falar de CACHE???

 

Na área da computação, cache é um dispositivo de acesso rápido, interno a um sistema, que serve de intermediário entre um operador de um processo e o dispositivo de armazenamento ao qual esse operador acede. A vantagem principal na utilização de uma cache consiste em evitar o acesso ao dispositivo de armazenamento - que pode ser demorado -, armazenando os dados em meios de acesso mais rápidos.

 

Trazendo para o contexto de bancos de dados, essa estrutura é conhecida como ATRIBUTO GERADO. Ele não faz parte do contexto original da tabela, mas por alguma razão (uma delas é performance) é útil que ele se encontre lá.

 

Agora me diz qual das queries abaixo tem o melhor desempenho:

SELECT * FROM topicos ORDER BY data_hora_ultimo_comentario;

ou

SELECT * FROM topicos t INNER JOIN comentarios c ON t.id = c.topico_id ORDER BY c.data_hora_comentario GROUP BY t.id;

 

Se você chama isso de gambiarra, está precisando rever seus conceitos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora me diz qual das queries abaixo tem o melhor desempenho:

SELECT * FROM topicos ORDER BY data_hora_ultimo_comentario;

ou

SELECT * FROM topicos t INNER JOIN comentarios c ON t.id = c.topico_id ORDER BY c.data_hora_comentario GROUP BY t.id;

Sem dúvida alguma é a a [ironic]segunda[/ironic]!

Não me leve a mal, mas eu não sou estagiário e sinceramente a discussão estava muito boa até aqui, mas usar este tipo de questionamente é basicamente chamar o outro de idiota...

Como eu disse no outro post, sei que existem várias maneiras de se chegar a um mesmo objetivo, isso é TI...

Compartilhar este post


Link para o post
Compartilhar em outros sites

bem @ESerra

o que o @Henrique Barcelos posto não acho uma gambiarra

 

ele deu uma solução de usar um inner join ou uma trigger isso e normal a nivel de banco.

 

@nicholaskr

assim se você ja tiver isso em um projeto inicial.

 

recomento utilizar ide para modelar banco e gerenciar banco

exemplo:

modelar:microlap

gerenciar:mysqlfront

 

crie seu banco assim

 

 

tabela topico

DROP TABLE IF EXISTS `topico`;

CREATE TABLE `topico` (
 `id_topico` int(11) NOT NULL AUTO_INCREMENT,
 `descricao` varchar(200),
 `data_ultima_atualizacao` timestamp DEFAULT Now(),
 PRIMARY KEY(`id_topico`)
)
ENGINE=MYISAM
ROW_FORMAT=default;

 

tabela comentarios

 

DROP TABLE IF EXISTS `comentario`;

CREATE TABLE `comentario` (
 `id_coment` int(11) NOT NULL AUTO_INCREMENT,
 `id_topico` int(11),
 `comentario` text,
 PRIMARY KEY(`id_coment`)
)
ENGINE=MYISAM
ROW_FORMAT=default;

DROP TRIGGER IF EXISTS `Novo_Comentario`;



DELIMITER |
CREATE TRIGGER `Novo_Comentario` AFTER INSERT
ON `comentario` FOR EACH ROW
BEGIN
 Update topico Set data_ultima_atualizacao = Now()
 Where id_topico = new.id_topico;
END; |
DELIMITER ;

 

Select

 

Select * From topico Order By data_ultima_atualizacao Asc

 

espero ter ajudado

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.