我有一個「事件」表,用於在實驗室計算機登錄,註銷,關機和啓動時存儲一些統計數據。使用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的工作方式?我可以優化我的數據,或以某種方式查詢以產生更快更可靠的結果嗎?
謝謝!
僅當您在時間戳上非常幸運時,第二個查詢纔有效。 – 2014-11-05 20:29:45
當事情一直持續下去時,請爲您的查詢發佈'EXPLAIN'的結果以查看您的查詢是如何執行的。幾乎總是缺少索引和無情的表掃描。 – tadman 2014-11-05 20:40:31
你應該儘量提供一個sql小提琴(至少在我看來)這樣的問題,使答案更容易 - 因爲我們許多人可能最終單獨做它。 – Kritner 2014-11-05 20:45:35