我试图在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
但是我对如何制作费率的问题感到困惑。
提前致谢!
答案 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)
您可以使用IF
和SUM
,如下所示:
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