[英]Getting distinct data in MySQL
目前,我正在獲取數據庫中唯一電子郵件地址的計數。
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
我想要實現的是在不忽略前幾周的電子郵件的情況下,獲取當前周中新電子郵件的計數。
我急需您的幫助。
您可以通過使用如下子查詢來實現:
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()
函數來獲取電子郵件的數量。
您將要匯總。 為了獲得日期,添加了不同的電子郵件:
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
並不是您的思維導圖中的applicationdate。 在您看來,此表中的email
是KEY,而不是Id
。 為什么不使dbschema與您的思想相融合? 這樣,您的查詢將變得更簡單,更高效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.