MySQL - 在where子句中引用聚合列

fuf*_*nzo 5 mysql sql aggregate max

这看起来很简单,但我似乎无法在不进行子查询的情况下弄明白(这似乎会大大减慢查询速度 - 需要大约10秒而不是<1).

假设我有一个已发送文档的表格,我想选择自上次发送以来已更新的文档,以及从未发送过的文档.

SELECT d.document_id, max(sd.document_sent_date) as last_sent_date
FROM documents d
LEFT JOIN sent_documents sd ON d.document_id=sd.document_id
WHERE last_sent_date is NULL OR last_sent_date<d.last_updated
GROUP BY d.document_id
Run Code Online (Sandbox Code Playgroud)

这样的事情可能吗?基本上,我想在where子句中使用max()的结果.

pax*_*blo 5

你想要这个having条款.

一般规则:聚合之前的where日期运行,聚合之后having对数据进行操作.

  • 更具体地说:在访问行时评估`WHERE`子句中的谓词; 在编写结果集之后,对`HAVING`子句中的谓词进行评估,几乎在执行计划中的最后一个(在处理ORDER BY和LIMIT子句之前).因此,HAVING子句中的谓词可以引用聚合,以及WHERE子句中无法访问的表达式和列别名. (2认同)