MYSQL从多个表中加入COUNTS和SUMS

时间:2014-06-27 09:42:38

标签: mysql count sum

我试图在SO中寻找类似的问题,到目前为止还没有找到。如果您愿意,请随意将重复或类似的问题标记到此。

我想加入几个列来显示报告。

我有3张桌子。

用户

ID  Name
1   Chris
2   John
3   Rick

InMessages

ID  Content   
1   Hello1
2   Hello2
3   Response1
4   Response2
5   Hello3
6   Hello4

OutMessages

ID UserID InMessageID Content         CurrentRate
1  1      1           ReplyHello1     10
2  2      2           Reply1Hello2    10   
3  3      2           Reply2Hello2    10
4  3      2           Reply3Hello2    10
5  1      3           ReplyResponse1  10
6  2      4           ReplyResponse2  10
7  1      5           ReplyHello3     4
8  3      6           ReplyHello4     4

我希望看到的报告如下:

User   InMessagesCount OutMessagesCount Rate10 Rate4
Chris  3               3                2      1     
John   2               2                1      1
Rick   2               3                2      1

我尝试过现有的查询,例如:

  count(distinct InMessages.ID) as InMessagesCount,
  count(distinct OutMessages.ID) as OutMessagesCount

但是我对如何制作费率的问题感到困惑。

提前致谢!

4 个答案:

答案 0 :(得分:2)

您的问题似乎是您的多个连接正在创建重复记录,因此需要在当前计数中使用DISTINCT。但是你不能用它来计算一个非不同字段的出现次数

因此我很想尝试这样的事情: -

COUNT(DISTINCT IF(OutMessages.CurrentRate = 10, OutMessages.ID, NULL) ) AS Rate10,
COUNT(DISTINCT IF(OutMessages.CurrentRate = 4, OutMessages.ID, NULL) ) AS Rate4

即如果id为10则使用id,否则使用NULL。像这样的COUNT应该(我认为)只计算非空值。

答案 1 :(得分:1)

对于Mysql,您可以将sum()与表达式一起使用,因此它将作为您的2种费率所需的计数进行评估

select 
u.Name,
count(distinct o.InMessageID) as InMessagesCount,
count(distinct o.ID) as OutMessagesCount,
sum(o.CurrentRate = 10) rate10,
sum(o.CurrentRate = 4) rate10
from OutMessages o
joins  users u on(u.id = o.user_id)
group by  u.id

答案 2 :(得分:0)

您可以总结那些符合特定费率的记录:

SUM(IF(OutMessages.CurrentRate = 10, 1,0)) AS Rate10,
SUM(IF(OutMessages.CurrentRate = 4, 1,0)) AS Rate4

答案 3 :(得分:0)

您可以使用IFSUM,如下所示:

SELECT UserID,
       COUNT(DISTINCT InMessages.ID) AS InMessagesCount,
       COUNT(DISTINCT OutMessages.ID) AS OutMessagesCount,
       SUM(IF(OutMessages.CurrentRate = 10, 1, 0)) AS Rate10,
       SUM(IF(OutMessages.CurrentRate = 4, 1, 0)) AS Rate4
FROM OutMessages
GROUP BY UserID