在MySQL中获取不同的数据

时间:2013-05-07 05:20:52

标签: mysql sql distinct

目前,我正在计算数据库中唯一电子邮件地址的计数。

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

我想要实现的是在当前一周内获取新电子邮件的数量,而不会忽略前几周的电子邮件。

我非常需要你的帮助。

2 个答案:

答案 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 |

请参阅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

答案 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与你的思想一致?那么您的查询将更简单,更高效。