2014-11-05 94 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