Ir ao conteúdo
  • Cadastre-se

Query "Top Comentarios"


Bergamaschi.

Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

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
;

Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

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...

APRENDA TUDO SOBRE HARDWARE!

HARDWARE 2022

 

CLIQUE AQUI E BAIXE AGORA MESMO!