2015-02-06 33 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