如果条件不是,如何选择无?

时间:2015-02-06 17:24:53

标签: mysql sql

我尝试做一个简单的查询来从数据库中进行选择,只选择适合超过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。

我想获得所有帐户的列表,其中mydates的年龄均超过1年。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分: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