Ir ao conteúdo

Query "Top Comentarios"


Bergamaschi.

Posts recomendados

Postado

Boa tarde CdH.

Tenho uma dúvida sobre como montar a query top comentarios. Pensei que ia ser fácil, mas to quebrando a cabeça e não consegui montar ainda. Uso MySQL.

Vamos supor, tenho a tabela de posts e a tabela de comentarios. Para resumir, vamos supor apenas os campos essenciais do problema.

//Tabela POST

ID int PK not null
Usuario varchar() not null
Mensagem varchar() not null[/QUOTE]

//Tabela COMENTARIO
[QUOTE]ID int PK not null
NumeroDoPost int FK not null
Comentario varchar() not null

Basicamente, quando um usuário comentar, ele vai fazer um insert na tabela COMENTARIOS inserindo no campo comentario a mensagem e no campo NumeroDoPost é uma Chave Estrangeira, que liga ao post cujo foi feito um comentario.

Vamos supor agora que tenha vários valores a tabela comentario:

(ID, NumeroDoPost, Comentario)
1, 10, 'Um comentario qualquer';
2, 10, 'Um comentario qualquer';
3, 10, 'Um comentario qualquer';
4, 12, 'Um comentario qualquer';
5, 12, 'Um comentario qualquer';
6, 10, 'Um comentario qualquer';
7, 10, 'Um comentario qualquer';
8, 13, 'Um comentario qualquer';
9, 13, 'Um comentario qualquer;
10, 10, 'Um comentario qualquer';
11, 13, 'Um comentario qualquer';

Como podem ver, o post 10 tem 6 comentários, o post 13 tem 3 comentarios e o post 12 tem 2 comentarios. Sendo assim o top comentarios seria: POST 10, POST 13, POST 12.

Sabendo essas informações, como seria a query? Tentei de todos os jeitos e não consegui.

Obrigado

Postado

Cara, é nesses momentos que sinto orgulho de mim mesmo, huahuahuahua

brincadeiras a parte, toma aí seu código completo, identifique seus campos e suas tabelas, está tudo aí com a estrutura que você postou (só não criei índices, etc).

CREATE TABLE tbPO
( POCDPO INTEGER NOT NULL AUTO_INCREMENT
, POCDUS VARCHAR(02) NOT NULL DEFAULT ''
, POMENS VARCHAR(60) NOT NULL DEFAULT ''
, PRIMARY KEY(POCDPO)
) ENGINE = INNODB;

CREATE TABLE tbCO
( COCDCO INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT
, COCDPO INTEGER NOT NULL DEFAULT 0
, COMENS VARCHAR(60) NOT NULL DEFAULT ''
, CONSTRAINT fk_COCDPO FOREIGN KEY(COCDPO) REFERENCES tbPO(POCDPO)
) ENGINE = INNODB;

INSERT INTO tbPO (POCDPO,POCDUS) VALUES (10,'01'),(12,'01'),(13,'01');

INSERT INTO tbCO (COCDPO,COMENS) VALUES
(10,'Um comentario qualquer')
, (10,'Um comentario qualquer')
, (10,'Um comentario qualquer')
, (12,'Um comentario qualquer')
, (12,'Um comentario qualquer')
, (10,'Um comentario qualquer')
, (10,'Um comentario qualquer')
, (13,'Um comentario qualquer')
, (13,'Um comentario qualquer')
, (10,'Um comentario qualquer')
, (13,'Um comentario qualquer');

SELECT COCDCO
,COCDPO
,COMENS
,(SELECT COUNT(*) FROM tbCO AS T2 WHERE T2.COCDPO = T1.COCDPO ) AS ORDEM
FROM tbCO AS T1 ORDER BY ORDEM DESC,COCDCO,COCDPO
;

  • Moderador
Postado

Bem eu teria uma outra solução, se eu entendi bem o problema..

faria uma tabela N:N e nele e depois agrupar e somar quantos registros o post tal possui depois fazer usar o max() para pegar os maiores valores.. enfim essa é só uma possibilidade.

Postado

Bom dia.

@Erciley Junior

Cara, é nesses momentos que sinto orgulho de mim mesmo, huahuahuahua

brincadeiras a parte, toma aí seu código completo, identifique seus campos e suas tabelas, está tudo aí com a estrutura que você postou (só não criei índices, etc).


CREATE TABLE tbPO
( POCDPO INTEGER NOT NULL AUTO_INCREMENT
, POCDUS VARCHAR(02) NOT NULL DEFAULT ''
, POMENS VARCHAR(60) NOT NULL DEFAULT ''
, PRIMARY KEY(POCDPO)
) ENGINE = INNODB;

CREATE TABLE tbCO
( COCDCO INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT
, COCDPO INTEGER NOT NULL DEFAULT 0
, COMENS VARCHAR(60) NOT NULL DEFAULT ''
, CONSTRAINT fk_COCDPO FOREIGN KEY(COCDPO) REFERENCES tbPO(POCDPO)
) ENGINE = INNODB;

INSERT INTO tbPO (POCDPO,POCDUS) VALUES (10,'01'),(12,'01'),(13,'01');

INSERT INTO tbCO (COCDPO,COMENS) VALUES
(10,'Um comentario qualquer')
, (10,'Um comentario qualquer')
, (10,'Um comentario qualquer')
, (12,'Um comentario qualquer')
, (12,'Um comentario qualquer')
, (10,'Um comentario qualquer')
, (10,'Um comentario qualquer')
, (13,'Um comentario qualquer')
, (13,'Um comentario qualquer')
, (10,'Um comentario qualquer')
, (13,'Um comentario qualquer');

SELECT COCDCO
,COCDPO
,COMENS
,(SELECT COUNT(*) FROM tbCO AS T2 WHERE T2.COCDPO = T1.COCDPO ) AS ORDEM
FROM tbCO AS T1 ORDER BY ORDEM DESC,COCDCO,COCDPO
;

Seu código funcionou na hora, obrigado. Mas queria entender o seu select, como ele funciona. Se pudesse me explicar, ficaria agradecido. Estava quebrando a cabeça demais, sendo que antes eu pensei que ia ser só mais uma query.

@dif

Olá dif. Pode explicar melhor a sua solução?

Pelo o que eu entendi, o BD iria checar TODOS os posts e "memorizar" o numero de comentários dele. Assim que tiver tudo memorizado, ele ordenaria os top10. É isso?

Se for, não consome muito tempo? Pois 10 posts é tranquilo, mas imagina 5000 posts e cada post com uma média de 50 comentários, iria consumir bastante tempo de processamento.

  • Moderador
Postado

Bergamaschi.,

minha solução é exatamente o mesmo que o ERCILEY, a diferença é que ele fez tudo em um select e eu criaria uma terceira tabela para receber os IDs dos posts e dos comentarios.. depois agrupar eles por ID com uma soma.

Dá no mesmo.. só um pouquinho mais de trabalho e dentro das regras de normalização.

Sobre o select.. é simples de entender que ele fez uma consulta nos campos, uma subconsulta para calcular a soma dos comentarios onde um ID seja igual ao da outra tabela e etc..

Apesar de ser uma ótima solução, eu não gosto de trabalhar com siglas.. prefiro dar nomes completos as tabelas para ficar mais claro.. assim como os campos

Arquivado

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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!