2013-12-09 26 views
0

有像這樣的結構後,HAVING:選擇行與給定日期

+----+------------+--------+-----------+ 
| id | date | userid | status | 
+----+------------+--------+-----------+ 
| 1 | 2013-06-05 |  1 | validated | 
| 2 | 2013-06-05 |  2 | validated | 
| 3 | 2013-06-06 |  2 | pending | 
| 4 | 2013-06-07 |  1 | validated | 
| 5 | 2013-06-08 |  1 | validated | 
| 6 | 2013-06-08 |  1 | validated | 
| 7 | 2013-06-09 |  1 | validated | 
+----+------------+--------+-----------+ 

如果我要選擇具有5種驗證狀態的用戶,我可以這樣做:

SELECT userid, COUNT(status) as valid 
FROM table1 
WHERE status="validated" 
GROUP BY userid 
HAVING valid=5 

現在我想要增加此查詢的複雜性,我想選擇具有從給定日期開始的5個驗證行的用戶:

SELECT userid, COUNT(status) as valid 
FROM ladder_offers_actions 
WHERE status="validated" 
AND date > "2013-06-06" 
GROUP BY userid 
HAVING valid=5 

這當然會返回上面給出的例子的0個用戶,這是因爲它只在2013-06-06(4)之後查看驗證的條目。

我要選擇的用戶,只有有一個給定的日期後5項驗證...例如:

用戶1 2013年6月6日之前確認行和 2013年以後生效的行-06-06 - 該用戶包含在select

用戶2具有 2013年6月6日之前驗證行和驗證一行之後2013年6月6日 - 這個用戶應該是包含在select中

用戶3在2013-06-06之前有5個驗證行 - 此用戶不應該包含在select中

用戶4在2013-06-06之後有5個經過驗證的行 - 此用戶應該包含在select中的

希望這足夠清楚,本質上我只希望那些在特定日期後有5個驗證行的用戶,但如果用戶還沒有5個驗證行,那麼在該日期之前包含行。

+0

你說的是什麼,你想用5行驗證,其中至少有一個是給定的日期後的用戶? – Matt

+0

只是在表上自己的條件 – Strawberry

回答

3

如果我正確理解你在問什麼,如何使用子查詢?喜歡的東西:

SELECT * from (
    SELECT userid, COUNT(status) as valid, MAX(date) as lastdate 
    FROM ladder_offers_actions 
    WHERE status="validated" 
    GROUP BY userid 
    HAVING valid=5 
) x WHERE x.lastdate > '2013-06-06' 
0

好,以簡化你的問題,你要選擇的人,如果她有5個驗證和她有一定的日期後任何驗證。

然後你可以使用:

SELECT userid, COUNT(status) as valid 
FROM ladder_offers_actions 
WHERE status="validated" 
and userid in 
    (SELECT t2.userid 
    FROM ladder_offers_actions t2 
    WHERE t2.date > "2013-06-06") 
GROUP BY userid 
HAVING valid=5