2014-11-05 96 views
0

我有一個「事件」表,用於在實驗室計算機登錄,註銷,關機和啓動時存儲一些統計數據。使用SQL查詢(MySQL數據庫)獲取不同項目的最新「事件」

我期待產生的是最後行動每個人 computername沒有名單。

這裏是我的表名爲什麼樣原料樣子:

mysql> select * from raw limit 20; 
+--------+--------------+-------+---------------------+ 
| id  | computername | event | timestamp   | 
+--------+--------------+-------+---------------------+ 
| 148776 | REF-18  |  1 | 2014-11-05 15:05:29 | 
| 148775 | DEC-02  |  3 | 2014-11-05 15:05:19 | 
| 148774 | GPS-06  |  3 | 2014-11-05 15:05:18 | 
| 148773 | DEC-15  |  3 | 2014-11-05 15:05:16 | 
| 148772 | DEC-02  |  1 | 2014-11-05 15:04:33 | 
| 148771 | REF-18  |  2 | 2014-11-05 15:04:18 | 
| 148770 | REF-09  |  1 | 2014-11-05 15:04:14 | 
| 148769 | REF-18  |  4 | 2014-11-05 15:04:02 | 
| 148768 | DEC-02  |  2 | 2014-11-05 15:03:39 | 
| 148767 | DEC-02  |  4 | 2014-11-05 15:03:24 | 
| 148766 | REF-09  |  2 | 2014-11-05 15:03:00 | 
| 148765 | DEC-08  |  3 | 2014-11-05 15:02:54 | 
| 148764 | REF-09  |  4 | 2014-11-05 15:02:44 | 
| 148763 | REF-09  |  3 | 2014-11-05 15:01:31 | 
| 148762 | DEC-01  |  1 | 2014-11-05 15:01:13 | 
| 148760 | REF-19  |  1 | 2014-11-05 15:00:50 | 
| 148761 | DEC-04  |  3 | 2014-11-05 15:00:50 | 
| 148759 | REF-18  |  3 | 2014-11-05 15:00:25 | 
| 148758 | DEC-36  |  1 | 2014-11-05 15:00:10 | 
| 148757 | DEC-01  |  2 | 2014-11-05 15:00:09 | 
+--------+--------------+-------+---------------------+ 

,我想出了一個解決方案夫婦的,我認爲可以工作;

SELECT r1.id, r1.computername, r1.event, r1.timestamp 
FROM raw r1 
JOIN (SELECT id, computername, event, MAX(timestamp) AS timestamp 
     FROM raw GROUP BY computername) 
AS r2 
ON r1.computername = r2.computername 
    AND r1.timestamp = r2.timestamp 
GROUP BY r1.computername; 

這似乎做的工作,但它需要˚FØ[Révé[R

SELECT * 
FROM (SELECT * from raw order by timestamp desc) row_result 
GROUP BY computername; 

這是迄今爲止花費相當少的時間,然而似乎產生相同的結果。哪個更好?第二個查詢只是一個黑客在MySQL的工作方式?我可以優化我的數據,或以某種方式查詢以產生更快更可靠的結果嗎?

謝謝!

+1

僅當您在時間戳上非常幸運時,第二個查詢纔有效。 – 2014-11-05 20:29:45

+2

當事情一直持續下去時,請爲您的查詢發佈'EXPLAIN'的結果以查看您的查詢是如何執行的。幾乎總是缺少索引和無情的表掃描。 – tadman 2014-11-05 20:40:31

+1

你應該儘量提供一個sql小提琴(至少在我看來)這樣的問題,使答案更容易 - 因爲我們許多人可能最終單獨做它。 – Kritner 2014-11-05 20:45:35

回答

2

你有沒有嘗試過這樣的事情:

select r.id, r.computername, r.event, r.timestamp 
from raw r 
inner join (
    select max(id) as id 
    from raw 
    group by computerName 
) as maxEventPerComputer on r.id = maxEventPerComputer.Id 

誠然這是非常相似,你的初始查詢,但(可能)索引你可能會得到一定程度上更好的成績特別是考慮到你的id列在您的日期列可能不是的(我想象)。

但是從我所瞭解的情況來看,與其他RDBMS相比,子查詢不太好...但希望這會有所幫助。

+0

這是** LOADS **更快...非常感謝。這似乎是最好的解決方案。我真的應該考慮一下這個事實,即我可以將MAX(id)拉回來,因爲它無論如何都是有罪的。 – 2014-11-06 00:58:55