MySQL在使用WHERE子句时如何使用MAX()函数

6

我正在使用PHP创建一个mySQL查询时遇到一些问题。我们有一个名为data_instant的表,其中包含一系列被输入的累积观测数据,称为Count_Qty,并且我们想提取先前的观测以从新的观测中减去以计算增长。

$result = mysql_query("SELECT *, 
MAX(Record_Time) 
FROM data_instant 
WHERE Node_ID='$nodeID' AND Type='$type';

$row = mysql_fetch_array ($result);

基本上我希望返回的是最大记录时间的行,但实际上只返回了第一个实例。前一个观察值具有最高的记录时间(Unix日期戳),所以我不清楚为什么它不能工作...


猜测,你期望的观察结果是否未被WHERE限制所选?或者你的“Record_Time”实际上不是整数类型? - Sean Owen
4个回答

15

如果你想获取具有最新Record_Time值的行,只需按照Record_Time的降序对行进行排序,然后获取顶部行:

SELECT *
FROM data_instant
WHERE Node_ID='$nodeID'
  AND Type='$type'
ORDER BY Record_Time DESC
LIMIT 1;

好的回答,你解释后这很明显,但我已经找了大约一个小时了。 - usumoio
这个方法可行,但有没有一种不需要对整个结果进行排序的方式呢?查询优化器能否找到一种高效的方法来查找最大值? - adamF
@adamF:嗯,我不确定在不遍历整个集合的情况下是否可以确定一个值是否大于另一个值。至于你的第二个问题,抱歉,我对查询优化器没有太多了解(至少不是关于MySQL的)。但是我不会担心查询优化器是否能为我的查询提供良好的执行计划。尽可能简单地表达您的请求,让优化器找到运行它的最佳方式-毕竟这就是它存在的目的。如果/当出现性能问题时,然后再考虑改进的方法。 - Andriy M
好的,排序需要O(nlgn),但是找到最大元素只需要O(n)。我猜测优化器识别了模式order by desc limit k并且在排序后找到了k个最大元素(假设k<<n)。但你说得对,如果它引起问题,我会去看一下……只是出于好奇 :) - adamF

1

where子句选择所有匹配Node_ID='$nodeID' AND Type='$type'的行。

对于这些行中的每一行,它将返回所有字段和最大记录时间。

如果您想要具有最大记录时间的行,则需要将其添加到where子句中:

SELECT * 
FROM data_instant 
WHERE Node_ID='$nodeID' AND Type='$type' 
and Record_Time = (select MAX(Record_Time) 
        FROM data_instant 
        WHERE Node_ID='$nodeID' 
        AND Type='$type')

0

如果您返回的结果超过了最大值,您应该在语句中添加GROUP BY以确保正确的聚合:

SELECT columnA,
    columnB, 
    MAX(Record_Time) 
FROM data_instant 
WHERE Node_ID='$nodeID' AND Type='$type'
GROUP BY columnA, columnB;

0
我希望返回最大的 Record_Time 行。
那么您只需要请求该列即可:
SELECT MAX(Record_Time) FROM data_instant 
WHERE Node_ID='$nodeID' AND Type='$type'

这将返回指定节点ID和类型的最大记录时间。


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