MySQL sum,用 group by 和 join 计数

Posted

技术标签:

【中文标题】MySQL sum,用 group by 和 join 计数【英文标题】:MySQL sum, count with group by and joins 【发布时间】:2014-01-12 11:07:23 【问题描述】:

我有三种表格类型,帖子和见解。

类型表包含帖子的类型。 post 表包含已发布的帖子。 洞察表包含每日发布的洞察。

这是我的 sql fiddle SQL Fiddle 的链接。

现在我想生成一个报告,其中包含每种类型的帖子数量以及他们的喜欢和 cmets 的总和,即类型 |计数(post_id)|总和(喜欢)|总和(厘米)。

这些是我的尝试:

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;

结果:聚合值不正确。

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;

结果:只显示一个帖子的点赞数和点赞数的总和。

【问题讨论】:

使用inner join 和不同的count 不是一个选项? sqlfiddle.com/#!2/89688/17 聚合值不正确。对于链接类型的帖子,like 和 cmets 的总和分别为 63 和 28。 嗯。我数了数,我认为它们是正确的!? 是的,那是我的错误,我在类型 ID 和帖子 ID 之间感到困惑,并计算了错误的行。谢谢。 【参考方案1】:

试试这个

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;

【讨论】:

我认为您在子查询中缺少 GROUP BY post_type。 我试过了,确实在子查询中错过了 group by。 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 group by post_type) as stats ON types.type_id = stats.post_type;【参考方案2】:

您的第一次尝试非常接近。但是每个post_id 都乘以insights 中的匹配数,所以你需要使用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;

或者,您可以使用子查询进行分组,该子查询结合了同一帖子的所有见解:

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;

FIDDLE

【讨论】:

聚合值不正确。对于链接类型的帖子,like 和 cmets 的总和分别为 63 和 28。 第一个看起来更好,我不会做第二个,除非我缺少一些东西 @ShayanHusaini 当我运行您列出的第一次尝试时,我得到 51 和 24,看起来正确,是吗? 哎呀我的错误,我在类型 ID 和帖子 ID 之间混淆了,这就是我的计算错误的原因。 第一个可能最适合这种特殊情况。我展示了第二个,因为这个习语在更复杂的情况下很有用。

以上是关于MySQL sum,用 group by 和 join 计数的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 条件 SUM 使用 GROUP BY 和 DISTINCT

MYsql5.7版本之后,用group by查询不在分组字段遇到的坑

使用 sum 和 group by 选项的 Mysql 查询运行速度非常慢

MySQL没有使用SUM中的索引和GROUP BY查询

使用函数 SUM() 和 Group by 将 Mysql 查询转换为 SQL 查询

怎么使用group by?