2014-09-23 210 views
0

我有一个关于MySQL的特定问题。请看看查询和结果设置如下:MySQL SUM(),COUNT()和GROUP BY

SELECT `SentTo`, 
     `Read` 
FROM `Emails` as t 

[email protected] | 1 
-------------------------------- 
[email protected] | 0 
-------------------------------- 
[email protected] | 1 
-------------------------------- 
[email protected] | 0 
-------------------------------- 
[email protected] | 1 
-------------------------------- 

我想获得的电子邮件对每封电子邮件的数量,总阅读。我将通过减去总数读取未读,并在脚本一侧阅读,在这里不需要它。

Email    | Total | Read 
-------------------------------------- 
[email protected] | 3 | 1 
-------------------------------------- 
[email protected] | 2 | 1 
-------------------------------------- 

有什么建议吗?我试图应用子查询,但我找不到合适的解决方案。

回答

3

这应该工作使用GROUP BY

SELECT `SentTo`, 
     COUNT(*) Total, 
     SUM(`Read`=0) 
FROM Emails 
GROUP BY `SentTo` 
+0

'SUM(Read = 0)'一个真正的Mysql解决方案条件计数+1 – 2014-09-23 05:20:11

0

集团通过应该得到期望的结果

SELECT sentTo, 
     Sum(READ) AS TotalRead, 
     Sum(CASE WHEN READ =0 THEN 1 ELSE 0) AS Unread 
FROM Emails 
GROUP BY sentTo 
+0

这将'SUM'读取列,而不是'SUM',当它等于0.此外,'Read'是MySql中的保留字,需要转义。 – sgeddes 2014-09-23 03:56:39

+0

当读数为1时,OP需要数值,正如您在第一封电子邮件有3个读数的示例中所看到的那样 – radar 2014-09-23 03:57:48

+0

这就是Total,它是COUNT(*)'。例如,hello有3条记录,但只有1条记录= 0。此查询返回hello 2 – sgeddes 2014-09-23 04:00:25

1

子句的 '按组' 可以解决这个问题如下:

SELECT `SentTo`, COUNT(*) as totalSend, (totalSend - SUM(`Read`)) as totalUnread 
FROM `Emails` 
GROUP BY `SentTo` 
+1

除了事实这是无效的语法,它不产生如果它是正确的结果...首先,你不能像这样在'SELECT'查询中引用列别名。第二,'COUNT(DISTINCT SentTo)'将始终等于1 - OP要求'COUNT(*)'... – sgeddes 2014-09-23 04:33:59

+0

@sgeddes - 谢谢队友。它已更新。 – 2014-09-23 05:25:57