数据:(log_time是DATETIME
类型)
log_id | action | log_time | user
--------------------------------------------------
1 Processed 2011-02-28 16:38:48 1
2 Processed 2011-03-02 16:56:43 5
3 Processed 2011-03-02 17:00:17 5
4 Processed 2011-03-03 08:59:33 5
查询:
SELECT log_time, user
FROM logs
WHERE action = "Processed"
GROUP BY action
HAVING MAX(log_time)
结果:
log_time | user
--------------------------
2011-02-28 16:38:48 1
显然,这根本没有最大 log_time。如果我将查询更改为...
SELECT MAX(log_time), user
FROM logs
WHERE action = "Processed"
然后我自然而然地得到:
log_time | user
--------------------------
2011-03-03 08:59:33 1
现在,我显然想要的数据是第 4 行中的数据:3 月 3 日,但是用户 5。我知道我可以通过执行一个简单的 SELECT ... ORDER BY log_time DESC LIMIT 1
。但我的问题是,我对这些不正确的 MAX()
查询做了什么?在我看来,如果我使用 HAVING MAX()
运行查询,它会为我提供具有最大值的行。我对 MAX()
的工作原理有什么不理解的地方?
编辑:为了详细说明我的问题,基本上,当我看到查询时......
SELECT * FROM logs WHERE action = "Processed"
GROUP BY action HAVING MAX(log_time)
...我的假设是,根据代码的显示方式,它将检索具有处理操作的最大 log_time 的行。这似乎是一个错误的假设。那么,HAVING MAX()
究竟意味着什么?
最佳答案
您需要为聚合函数包含一个 GROUP BY 子句。
SELECT MAX(log_time), user
FROM logs
WHERE action = "Processed"
GROUP BY user
或者,如果您要查找单个值,则根本不包括用户:
SELECT MAX(log_time)
FROM logs
WHERE action = "Processed"
最后,如果您希望用户与单个最大值相关联,请使用子查询
SELECT l.user, l.log_time
FROM logs l
INNER JOIN (SELECT MAX(log_time) as max_time
FROM logs
WHERE action = "Processed") q
ON l.log_time = q.max_time
AND l.action = "Processed"
关于mysql - 我对 SQL MAX() 有什么不了解的地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5182736/