我有一个“事件”表,用于在实验室计算机登录,注销,关机和启动时存储一些统计数据。使用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