2013-11-29 57 views
1

在這個表中我有四列的MySQL獲得通過時間戳最新的記錄,而不子查詢

id state_id state  add_time 
1  10   1  1385461144 
2  12   3  1385461144 
3  14   2  1385461144 
4  12   5  1385461264 
5  10   2  1385461264 

我想最後一個字段,以獲得最新的記錄(add_time)

結果必然是這樣

id state_id state  add_time 
3  14   2  1385461144 
4  12   5  1385461264 
5  10   2  1385461264 

我發現這個問題get the records for the latest timestamp mysql 它使用兩個select查詢(子查詢)。但我不想使用子查詢。

是否有其他方式獲取最新記錄?

+1

什麼是錯的子查詢? –

+0

我認爲它比其他方式慢。 – M2sh

+0

'INNER JOIN'或使用函數像'MAX(add_time)':) – M2sh

回答

5

有兩種方法可以獲得您要查找的結果。

左連接解決方​​案:

SELECT t1.* FROM t t1 
LEFT JOIN t t2 
ON t1.state_id = t2.state_id AND t1.add_time < t2.add_time 
WHERE t2.add_time IS NULL 

小提琴here

子查詢的解決方案:

SELECT t1.* FROM t t1 
JOIN (
    SELECT state_id, max(add_time) add_time FROM t 
    GROUP BY state_id 
) t2 
ON t1.state_id = t2.state_id AND t1.add_time = t2.add_time 

小提琴here

雙方將輸出:

| ID | STATE_ID | STATE | ADD_TIME | 
|----|----------|-------|------------| 
| 3 |  14 |  2 | 1385461144 | 
| 4 |  12 |  5 | 1385461264 | 
| 5 |  10 |  2 | 1385461264 | 
+0

謝謝,哪一個更快? – M2sh

+0

最有可能的是第二個。但我建議你給兩個試試看:) –

+0

好吧,我會測試它,但我認爲第一個更好。 – M2sh

0

如果你是一個客戶端(瀏覽器或應用程序)synching數據,每個呼叫設定的參數用於指定最後的同步時間(財產以後像lastSyncTime)和基於在這個查詢你的數據庫。對於第一次調用,在邏輯中設置參數lastSyncTime = 0,對於後續調用,使用MAX(ADD_TIME)。這些計算必須在您的客戶端。而在你的服務器,你需要獲取參數lastSyncTime和做一個查詢這樣的事情

SELECT id, state_id, state, add_time FROM tabname WHERE add_time > lastSyncTime 

所以,你的服務器和數據庫服務器不會有太大的負荷。

+0

謝謝,但我不同步數據,我每隔5分鐘存儲新的狀態,並希望通過add_time在我的表中獲取最新狀態。 – M2sh

+0

@ M2sh好的,然後去加入 – Damodaran

1

,而你在它來測試哪一個是快,這裏有另外一個嘗試 http://sqlfiddle.com/#!2/760c73/13/0

SELECT id,state_id,state,add_time 
    FROM t t1 
WHERE NOT EXISTS 
     (SELECT 1 
     FROM t t2 
     WHERE t2.state_id = t1.state_id 
     AND t2.add_time > t1.add_time); 
+0

謝謝,我會盡快測試。 – M2sh

相關問題