我尝试做一个简单的查询来从数据库中进行选择,只选择适合超过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年。我怎样才能做到这一点?
答案 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