2015-02-06 87 views
2

我嘗試做一個簡單的查詢來從數據庫中進行選擇,並只選擇適合陳述大於12個月的行。如何不選擇條件?

表像(指明MyDate實際上是一個時間字段):

+----+---------+-------------+ 
| id | account | mydate  | 
+----+---------+-------------+ 
| 1 | 1  | last week | <-- this should disqualify account 1 
| 2 | 1  | 2 years ago | 
| 3 | 1  | 3 years ago | 
| 4 | 2  | 2 years ago | 
+----+---------+-------------+ 

這是我的查詢現在:

SELECT id, account, MAX(mydate) 
FROM awesomeTable 
WHERE 
    mydate < SUBDATE(CURDATE(), INTERVAL 12 MONTH) 
GROUP BY account 

看上去不錯。但結果如下:

+----+---------+-------------+ 
| id | account | mydate  | 
+----+---------+-------------+ 
| 2 | 1  | 2 years ago | <-- SQL doesnt understand me :(
| 4 | 2  | 2 years ago | 
+----+---------+-------------+ 

但我不想讓帳戶2顯示出來。我真的只想看看mydate大於2年的帳戶。

現在使用該查詢,它不顯示ID 1,因爲這不符合WHERE子句中的條件。但它會向我展示其他行的最新可能mydate。

我想獲取所有帳戶的列表,其中的所有帳戶都大於1年。我怎麼能做到這一點?

回答

3

還有WHERE條件是先完成選擇行,然後MAX()適用於這些結果。聚合後使用HAVING對結果進行操作。

SELECT id, account, MAX(mydate) AS maxdate 
FROM awesometable 
GROUP BY account 
HAVING maxdate < DATE_SUB(NOW(), INTERVAL 12 MONTH) 

請注意,這不一定會顯示具有最大日期的行的id。爲此,您需要加入:

SELECT a.id, a.account, a.mydate 
FROM awesometable AS a 
JOIN (
    SELECT account, MAX(mydate) AS maxdate 
    FROM awesometable 
    GROUP BY account 
    HAVING maxdate < DATE_SUB(NOW(), INTERVAL 12 MONTH)) AS b 
ON a.account = b.account AND a.mydate = b.maxdate 
+0

我無法使腳本正常工作,但看起來正確。 ''你的SQL語法錯誤;檢查對應於你的MySQL服務器版本的手冊,在第4行使用'GROUP BY帳戶限制0,100000'附近的正確語法SQL.sql「' - mySQL服務器是版本5.5。 – Trollwut 2015-02-09 15:24:06

+0

對不起,GROUP BY在HAVING之前。 – Barmar 2015-02-09 16:23:41

+0

而且 - 魔法 - 它的工作原理!也沒有見過。謝謝你的回答,幫了我很多! – Trollwut 2015-02-09 17:00:33