我有2张桌子。
第一个表用于我的对象(~1,000 行)。
Table Name: object
ID | name
1 | Dummy object 1
2 | Dummy object 2
3 | Dummy object 3
...
724 | Dummy object 724
...
etc.
第二个表用于对象事件(~200,000 行)
Table Name: events
ID | ID_OBJ | ID_MES | description | timestamp
1 | 3 | 3071 | Test event | 2017-01-28 12:00:01
2 | 4 | 3001 | Doors opened | 2017-01-28 13:00:04
3 | 3 | 3002 | Doors closed | 2017-01-28 13:33:45
...
etc...
当我使用此查询时,从表中加载数据大约需要 10 秒:
SELECT
o.ID, o.name, e.timestamp AS last_event
FROM
object AS o
LEFT JOIN
events AS e
ON
e.ID_OBJ = o.ID
AND
(SELECT MAX(ID) FROM events WHERE events.ID_OBJ = o.ID AND ID_MES != 3071)
GROUP BY
o.ID
我需要获取我的对象列表,包括上一个事件的时间戳,但我不需要包含 ID_MES 3071 的事件。
当我从查询中删除"AND ID_MES != 3071"时,它的效果非常快。有人知道这个问题的解决方案来提高速度吗?
所以这有效:
SELECT o.ID, o.name, MAX(e.timestamp) AS last_event
FROM
object o
LEFT JOIN
events e
ON
e.ID_OBJ = o.ID AND e.ID_MES != 3071
GROUP BY
o.ID
它应该相当快。如果您还想选择最近事件的另一个字段,则需要查看每组最大 n 个标记。
小提琴:http://rextester.com/XWLWYS80827