目前,我正在计算数据库中唯一电子邮件地址的计数。
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
我想要实现的是在当前一周内获取新电子邮件的数量,而不会忽略前几周的电子邮件。
我非常需要你的帮助。
答案 0 :(得分:0)
您可以使用以下子查询来实现此目的:
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 |
以下是查询的说明:
首先,您需要在两个日期(即一周)之间收到电子邮件,如下所示:
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()
功能来获取电子邮件的数量。
答案 1 :(得分:0)
你想要聚合。要获取日期,请添加一个不同的电子邮件:
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与你的思想一致?那么您的查询将更简单,更高效。