2012-04-01 111 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')