我有一个MariaDB表,其中包含订单事件:
EVENTID | ORDERID | 数据 | TIMESTAMP|
---|---|---|---|
1 | 1 | "uff1"> | 2021-12-17 11:48:00.000 |
2 | 1 | 'newstuff1'2021-12-17 11:49:00.000 | |
3 | 1 | 'newerstuff1' | 2021-12-17 11:49:30.000 |
4 | 2 | ‘stuff2’ | 2021-12-17 11:50:0.000 |
5 | 3 | 'stuff3' | 2021-12-17 11:51:10.000 |
6 | 3 | 'newstuff3'2021-12-17 11:52:00.000 |
SELECT m3.*
FROM ( SELECT ORDERID, MAX(TIMESTAMP) AS TIMESTAMP
FROM MESSAGES m1
GROUP BY ORDERID ) m2
JOIN MESSAGES m3 USING(ORDERID, TIMESTAMP);
并具有
INDEX(ORDERID, TIMESTAMP)
该查询是一个";成组最大值";图案
派生表(子查询(将跳过索引,然后从表中查找其余列。
如果给定订单id有任何重复的时间戳,它将传递多行。如果不需要,请参阅this了解更多选项。
SELECT *
FROM table t1
WHERE NOT EXISTS ( SELECT NULL
FROM table t2
WHERE t1.orderid = t2.orderid
AND t1.`timestamp` < t2.`timestamp` )
也就是说,如果没有其他具有相同订单id和最近日期的行,只需选择该行。
PS。(orderid, `timestamp`)
的指数会有所提高。