example - mysql group by having
MySQL sum, cuente con group by y join (2)
Tengo tres tipos de tablas, publicaciones y perspectivas.
- La tabla de tipos contiene los tipos de publicaciones.
- La tabla de publicaciones contiene la publicación que se ha realizado.
- la tabla de insight contiene las ideas de la publicación a diario.
Aquí está el enlace a mi sql violín SQL Fiddle .
Ahora quiero generar un informe que contenga la cantidad de publicaciones contra cada tipo y la suma de sus "me gusta" y comentarios, es decir, Tipo | COUNT (post_id) | SUM (Me gusta) | SUM (comentarios).
Estos son mis intentos:
select type_name, count(p.post_id), sum(likes), sum(comments)
from types t
left join posts p on t.type_id = p.post_type
left join insights i on p.post_id = i.post_id
group by type_name;
Resultado : los valores agregados no son correctos.
select type_name, count(p.post_id), p.post_id,
(select sum(likes) from insights where post_id = p.post_id) as likes,
(select sum(comments)from insights where post_id = p.post_id) as comments
from types t
left join posts p on t.type_id = p.post_type
group by type_name;
Resultado : muestra la suma de Me gusta y comentarios de una sola publicación.
Tu primer intento fue muy cercano. Pero cada post_id
se estaba multiplicando por el número de coincidencias en insights
, por lo que debe usar DISTINCT
:
select type_name, count(distinct p.post_id), sum(likes), sum(comments)
from types t
left join posts p on t.type_id = p.post_type
left join insights i on p.post_id = i.post_id
group by type_name;
Alternativamente, puede agrupar con una subconsulta que combine todos los conocimientos para la misma publicación:
select type_name, count(*), sum(likes), sum(comments)
from types t
left join posts p on t.type_id = p.post_type
left join (select post_id, sum(likes) likes, sum(comments) comments
from insights
group by post_id) i on p.post_id = i.post_id
group by type_name;
prueba esto
SELECT types.type_name, stats.posts, stats.likes, stats.comments
FROM types
LEFT JOIN (
select post_type, count(i.post_id) as posts, sum(i.likes) as likes, sum(i.comments) as comments
from insights i INNER JOIN posts p ON i.post_id = p.post_id
) as stats
ON types.type_id = stats.post_type;