目前,我正在获取数据库中唯一电子邮件地址的计数。
Table1
---------------------------------------------
id email name date_applied
---------------------------------------------
1 abc@mail.com ABC 2013-04-17
2 bcd@mail.com BCD 2013-04-18
3 xyz@mail.com XYZ 2013-04-20
4 tre@mail.com TRE 2013-04-28
5 esf@mail.com ESF 2013-04-29
6 bcd@mail.com BCD 2013-04-29
7 abc@mail.com ABC 2013-04-30
---------------------------------------------以下是关于我如何获得本周的独特电子邮件的查询:
select count(distinct(`A`.`email`)) as total
from Table1 as A
where A.date_applied BETWEEN `2013-04-29` and `2013-05-05`
Current Week: 2013-04-29 => 2013-05-05我想要实现的是在不忽略前几周的电子邮件的情况下,获得本周的新电子邮件的数量。
我非常需要你的帮助。
发布于 2013-05-07 13:44:40
你会想要聚合。要获取添加不同电子邮件的日期,请执行以下操作:
SELECT email, MIN(date_applied) as first
FROM Table1
GROUP BY email
HAVING first BETWEEN 2013-04-29 AND 2013-05-05结果中的行数就是您的答案。
或者使用子查询。我仍然需要习惯MySQL对它们的支持。:)
不过,您应该考虑一下您的模式设计。我知道这可能是一个最小的例子,但date_applied并不是你思维导图中的应用日期。在您的心目中,email是这个表中的关键,而不是Id。为什么不让dbschema与您的想法一致呢?那么您的查询将会更简单,性能更高。
发布于 2013-05-07 13:35:37
您可以通过使用子查询来实现这一点,如下所示:
SELECT COUNT(DISTINCT `email`) AS Total FROM Table1 AS A
WHERE A.date_applied
BETWEEN '2013-04-29' AND '2013-05-05'
AND A.email NOT IN (SELECT email FROM Table1
WHERE date_applied < '2013-04-29');结果:
| TOTAL |
---------
| 1 |请参阅this SQLFiddle
以下是查询的描述:
首先,你需要在两个日期(即一周)之间收到邮件,如下所示:
SELECT DISTINCT email FROM Table1
WHERE date_applied BETWEEN '2013-04-29' AND '2013-05-05'然后搜索不唯一的电子邮件(即在之前的日期已经存在):
SELECT email
FROM Table1
WHERE date_applied < '2013-04-29'现在使用NOT IN从当前查询中排除这些电子邮件
SELECT DISTINCT `email` FROM Table1 AS A
WHERE A.date_applied
BETWEEN '2013-04-29' AND '2013-05-05'
AND A.email NOT IN (SELECT email FROM Table1
WHERE date_applied < '2013-04-29');现在使用COUNT()函数来获取电子邮件的数量。
请参阅this SQLFiddle
https://stackoverflow.com/questions/16411729
复制相似问题