0

目前我正在获取数据库中唯一电子邮件地址的数量。

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

我想要实现的是在不忽略前几周的电子邮件的情况下获取本周新电子邮件的数量。

我非常需要你的帮助。

4

2 回答 2

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 |

看到这个 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()函数来获取电子邮件的数量。

看到这个 SQLFiddle

于 2013-05-07T05:35:37.173 回答
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中是 KEY 在这个表中,而不是Id. 为什么不让 dbschema 与您的想法一致?然后您的查询将更简单,性能更高。

于 2013-05-07T05:44:39.700 回答