from example mysql select join group-by aggregate-functions

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;

VIOLÍN


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;