Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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á.
>
tenta ai
order by comentarios,id
Ta mas é que assim, os comentarios estão em outra tabela, então teria que puxar dela, mas como?
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.
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.
tenta um inner join pesquisa no google isso
>
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.
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;Edit: só para esclarecer, a grosso modo, new representa a tabela comentários, mais precisamente, o registro que acabou de ser inserido.
>
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...
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.
>
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...
Gostaria muito de entender porque isso é uma gambiarra, segundo o seu ponto de vista...
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;DELIMITER ;
Select
Select * From topico Order By data_ultima_atualizacao Asc
espero ter ajudado
tenta ai
order by comentarios,id