我正在尝试在此处实施与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;
我想要得到的是离纬度最近(小于5KM或10英里)到纬度/经度18.52,73.58的车辆,因为会有多个这样的条目,按EventData.deviceID(它们的唯一ID)对它们进行分组最后按时间戳排序,以获得每台设备的最新记录。我正在使用此部分,因为该表已有索引&amp;使用此功能也可以大大加快响应速度:
AND `EventData`.`accountID` = 'sysadmin'
显然,由于选择了独特的车辆,我做了一些非常错误的事情但是他们的时间戳意味着它们既不是最早的也不是最新的记录。我是MySQL n00b,请不要判断!
http://code.google.com/apis/maps/articles/phpsqlsearch.html
是商店定位器的Google示例,但具有唯一的商店记录。
答案 0 :(得分:0)
尝试按
排序ORDER BY MAX(`EventData`.`timestamp`) DESC;
答案 1 :(得分:0)
这就解决了我的问题。
在SELECT语句中,我使用了(感谢@symcbean):
MAX(`EventData`.`timestamp`)
这消除了使用Order By子句的需要(无论如何都没有用)。 但是,在使用大量CPU时,查询仍然很慢并且执行时间超过500毫秒。所以我用PHP计算了当前的时间戳和6天的时间戳,然后执行了查询,瞧!仅200毫秒,最佳CPU使用率!
度Acc。对于EXPLAIN数据输出,它使用临时表&amp; filesort也是。
此链接可能有助于使用“内部联接”等获得更优化的查询,但我不确定如何操作! http://kristiannielsen.livejournal.com/6745.html