2012-04-01 79 views
6

我在使用PHP创建mySQL查询时遇到了一些问题。我们有一个名为data_instant的表,其中输入了一系列累计观察值,称为Count_Qty,我们想提取前一个表以从新观察值中扣除以计算增加值。MySQL使用MAX()和WHERE子句

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

$row = mysql_fetch_array ($result); 

基本上我希望最大的Record_Time行被返回,但是它只是第一个被接收的实例。以前的观察记录具有最高的Record_Time(Unix日期戳),所以我不清楚为什么这不起作用...

+0

野性猜测,是你期待没有被WHERE限制选择的观察结果吗?或者你的'Record_Time'实际上不是一个整数类型? – 2012-04-01 17:07:53

回答

14

如果你想与最新的Record_Time值的行,只需在该行进行排序Record_Time的降序排列并得到第一排:

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

很好的答案,在你解释之后,这点很明显,但我一直在寻找这个问题大概一个小时。 – usumoio 2013-11-20 16:58:41

+0

这有效,但有没有办法做到这一点,而不整理整个结果?查询优化器是否会找到找到最大值的有效方法? – adamF 2014-08-01 16:08:16

+0

@adamF:嗯,我不确定你是否可以确定一个值是否大于集合中的任何其他值而不经过整个集合。至于你的第二个问题,对不起,对查询优化器没有多少了解(至少不是关于MySQL的)。但是,我不担心查询优化器是否能为我的查询提供一个很好的执行计划。尽可能简单地表达您的请求,并让优化器找到运行它的最佳方式 - 毕竟这就是它的存在。 *如果/当*出现性能问题时,*然后*开始考虑改进方法。 – 2014-08-01 16:41:49

0

如果您有超过MAX被返回,您应该添加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' 

这将返回最大RECORD_TIME指定的NODE_ID和类型。

1

where子句选择匹配节点代号=“$节点ID”中的所有行和类型=“$类型”。

对于每个将返回所有领域,最大记录时间的那些行的。

如果你想和你需要将它添加到您的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')