在mysql sql where子句中类似于MAX的东西

时间:2010-02-11 15:43:32

标签: sql mysql

我正在尝试编写一个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未知。

知道我该怎么做吗?

3 个答案:

答案 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偶尔在约会时更快。