在MySQL的SQL语句中,类似于MAX函数的东西在哪个where子句中使用?

4

我正在尝试编写一个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天内没有被联系过的人。显然,在where子句中无法使用max函数,所以这种方法行不通。
我看到了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个回答

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子句。


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)

0

根据您的数据集/索引的大小,您可能还需要考虑使用带有ORDER BY的"TOP 1"而不是"MAX"。在日期方面,TOP 1有时会更快。


1
昨天我和某人正在讨论这个问题,但他的问题是他想要每个用户的MAX()值集合,而不是每个查询的值,例如SELECT MAX(activity.activitydate)。他最初的查询只是假设性的,无效的。 - Marc Bollinger
1
"TOP 1" 是 SQL Server 的语法 - 对于 MySQL,同义词将是 "LIMIT 1"。 - OMG Ponies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接