我正在尝试编写一个sql函数来执行以下操作:
SELECT
person.id,
person.phonenumber
FROM
person INNER JOIN activity ON person.id = activity.personid
WHERE
MAX(activity.activitydate) < DATE_SUB(CURDATE(), INTERAVAL 180 DAY);
每次联系一个人时,我们都会为他们创建一个带有笔记等的活动记录。所以我正在寻找在过去180天内没有联系过的所有人。显然,这不起作用,因为max不能在where子句中使用。
我看到了this,但是mysql没有with语句。
另外,我试过
SELECT
person.id,
person.phonenumber,
MAX(activity.activitydate) as ndate
FROM
person INNER JOIN activity ON person.id = activity.personid
WHERE
ndate < DATE_SUB(CURDATE(), INTERVAL 180 DAY)
GROUP BY person.id;
但ndate未知。
知道我该怎么做吗?
答案 0 :(得分:9)
您需要使用HAVING
子句:
SELECT p.id,
p.phonenumber
FROM PERSON p
JOIN ACTIVITY a ON a.personid = p.id
GROUP BY p.id, p.phonenumber
HAVING MAX(a.activitydate) < DATE_SUB(CURDATE(), INTERVAL 180 DAY)
...这意味着定义GROUP BY
子句。
答案 1 :(得分:0)
您可以使用having子句:
SELECT
person.id,
person.phonenumber,
MAX(activity.activitydate) as ndate
FROM
person INNER JOIN activity ON person.id = activity.personid
GROUP BY person.id
HAVING MAX(activity.activitydate) < DATE_SUB(CURDATE(), INTERVAL 180 DAY)
答案 2 :(得分:0)
根据数据集/索引的大小,您还可以使用“TOP 1”和ORDER BY与“MAX”。 TOP 1偶尔在约会时更快。