mysql - 我对 SQL MAX() 有什么不了解的地方?

标签 mysql max

数据:(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/

相关文章:

mysql - 设计 mysql 数据库技巧和技术,以及一些 mysql 问题?

php - 这个sql输入验证安全吗?

php - 如果等于 N/A,则在向列添加更多文本之前从列中删除文本

MySQL UNION SELECT 在几列上查找 MAX 中的 MAX

java - 确定最大整数 "null saved"

r - 在 R 中找到使最大值的值

mysql - 使用 AUTO_INCREMENT 列将 DataFrame 插入到 SQL 表中

php - 如何显示忘记密码的sql查询

c++ - 使用 ppl.h 查找最大值

javascript - 5 里后不再显示并放置 `...`