Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Tenho várias estatísticas que quero mostrar dentro de um site, as mesmas são carregadas diversas vezes e em grande quantidade.
Existem usuários e produtos, onde os usuários podem comentar e dar nota para os produtos.
Estou salvando os comentários em uma tabela e as notas em outra (usuários podem comentar várias vezes e votar apenas uma).
----
Situação 1:
Quero listar os usuários e mostrar o nome, quantos produtos comentou e quantos deu nota.
SELECT u.id_usuario, u.nome, COUNT(c.id_comentario) AS comentarios, COUNT(n.id_nota) AS notas
FROM usuario u
LEFT JOIN comentario c ON c.id_usuario = u.id_usuario
LEFT JOIN nota n ON n.id_usuario = u.id_usuario
GROUP BY u.id_usuario
ORDER BY comentarios DESC
---
Situação 2:
Quero listar os produtos e mostrar o nome, quantos comentários recebeu, quantas notas recebeu e a nota média.
SELECT p.id_produto, p.nome, COUNT(c.id_comentario) AS comentarios, COUNT(n.id_nota) AS notas, AVG(n.nota) AS media
FROM produto p
LEFT JOIN comentario c ON c.id_produto = p.id_produto
LEFT JOIN nota n ON n.id_produto = p.id_produto
GROUP BY p.id_produto
ORDER BY media DESC
---
Essas situações se resolvem com um SQL com alguns joins e considerando determinado número de registros ou a necessidade de utilizar um ORDER BY, a consulta está ficando lenta.
-------
O que pensei para solucionar:
Criar triggers nas tabelas de comentario e nota que atualiza um campo existente na tabela de usuários e produtos, ou seja, na tabela de usuários irá existir uma coluna comentarios, toda vez que um comentário for salvo, ele vai calcular o total de comentários e atualizar a tabela usuários, assim quando eu precisar de uma lista conforme as situações citadas acima, precisarei fazer apenas um SQL simples na tabela respectiva.
SELECT id_usuario, nome, comentarios, notas FROM usuario WHERE id = 1 ORDER BY comentario DESC;
SELECT id_produto, nome, comentarios, notas, media FROM produto WHERE id = 1 ORDER BY media;
---
O que estou propondo é gambiarra ou é uma solução considerável?
Tentei de "n" formas fazer esses SELECT, minha tabela de produtos possui 200.000 registros e o tempo de retorno é impraticável, caso o que estou propondo seja gambiarra, gostaria de alguma luz quanto a criação dessas querys.
Obrigado.
Carregando comentários...