MySQL 按时间戳分组/排序不能按预期工作

Posted

技术标签:

【中文标题】MySQL 按时间戳分组/排序不能按预期工作【英文标题】:MySQL grouping/ordering by timestamp doesn't work as expected 【发布时间】:2011-12-13 12:13:20 【问题描述】:

我正在尝试在此处实现类似于 Google 商店定位器的功能,但使用车辆的 GPS 事件,因此每辆车有多个事件。这方面的数据在 EventData 表中。

这是表格的格式和一些示例数据 - 为方便起见,生成到现在的时间戳略有不同:

    deviceID|timestamp |longitude|latitude|
    1       |1323777977|73.52    | 18.55  |         
    2       |1323777973|73.52    | 18.55  |
    1       |1323777833|73.52    | 18.55  |
    1       |1323778111|73.52    | 18.55  |
    3       |1323777912|73.52    | 18.55  |
    2       |1323777922|73.52    | 18.55  |
    3       |1323777971|73.52    | 18.55  |
    3       |1323777831|73.52    | 18.55  |
    1       |1323777957|73.52    | 18.55  |
    1       |1323778111|73.52    | 18.55  |

这是查询:

SELECT DISTINCT(`EventData`.`deviceID`),`EventData`.`timestamp`,`EventData`.`latitude`, `EventData`.`longitude`,
 (6371 * acos( cos( radians(18.52) ) * cos( radians( `EventData`.`latitude` ) ) * cos( radians( `EventData`.`longitude` ) - radians(73.58) ) + sin( radians(18.52) ) * sin( radians( `EventData`.`latitude` ) ) ) ) 
   AS distance FROM `EventData` AS `EventData` 
    WHERE `EventData`.`timestamp` >= UNIX_TIMESTAMP(date_sub(now(), INTERVAL 6 day)) AND `EventData`.`timestamp` <= UNIX_TIMESTAMP(now()) AND `EventData`.`accountID` = 'sysadmin' 
     GROUP BY `EventData`.`deviceID` 
     HAVING distance < 5 
     ORDER BY `EventData`.`timestamp` DESC;

我想要得到的是距离纬度/经度 18.52、73.58 最近的车辆(小于 5 公里或 10 英里),因为会有多个这样的条目,它们按 EventData.deviceID (它们的唯一 ID)分组最后按时间戳排序以获取每台设备的最新记录。我使用这个部分,因为表已经有一个索引&使用这个函数也可以大大加快响应速度:

AND `EventData`.`accountID` = 'sysadmin'

显然我做错了什么,因为选择了独特的车辆,但它们的时间戳暗示它们既不是最早的也不是最新的记录。我是 mysql n00b,请不要评判!

http://code.google.com/apis/maps/articles/phpsqlsearch.html 是 Google 的商店定位器示例,但具有唯一的商店记录。

【问题讨论】:

"最后按时间戳排序" - 不,您应该为每辆车开始计算它们的位置之前只选择最新的(按时间戳) @symcbean 我在 SELECT 语句本身中添加了 MAX(EventData.timestamp) 并且它可以在没有子查询的情况下工作!请将此作为答案发布,以便我接受.. @symcbean 这个查询需要 0.67 秒和很多 cpu!索引如下:accountID 0 A deviceID 0 A timestamp 0 A statusCode 703 A 【参考方案1】:

尝试排序

ORDER BY MAX(`EventData`.`timestamp`) DESC;

【讨论】:

【参考方案2】:

这就是解决我的问题的方法。

在 SELECT 语句中,我使用了(感谢@symcbean):

MAX(`EventData`.`timestamp`)

这消除了使用 Order By 子句的需要(无论如何它都不起作用)。 但是,查询仍然很慢,执行时间超过 500 毫秒,同时占用了大量 CPU。所以我在 PHP 中计算了当前时间戳和前 6 天的时间戳,然后执行查询,瞧!仅 200 毫秒和最佳 CPU 使用率!

累加。对于 EXPLAIN 数据输出,它也使用临时表和文件排序。

此链接可能有助于通过“内部联接”等获得更优化的查询,但我不知道如何! http://kristiannielsen.livejournal.com/6745.html

【讨论】:

***.com/questions/4716369/…

以上是关于MySQL 按时间戳分组/排序不能按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

Pandas DataFrame 按时间戳分组

PostgreSQL - 按时间戳值分组?

带有 UNIX 时间戳的 MySQL 表 - 按时间戳排序并计算一行与前一行之间的差异

选择按名称,jobId和Action分组的时间戳的最大值[重复]

按 Unix 时间戳中的时隙分组

Mysql 的按时间段分组查询