Группировка / упорядочение MySQL по отметке времени не работает должным образом - PullRequest
1 голос
/ 13 декабря 2011

Я пытаюсь реализовать что-то похожее на локатор магазина 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;

То, что я пытаюсь получить, - это транспортное средство, ближайшее (менее 5 км или 10 миль) к широте / долготе 18,52, 73,58, и поскольку таких записей будет несколько, сгруппируйте их по EventData.deviceID (их уникальный идентификатор) и, наконец, упорядочение по отметке времени для получения последней записи для каждого устройства. Я использую этот раздел, так как в таблице уже есть индекс, и эта функция также значительно ускоряет ответ:

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

Очевидно, что я делаю что-то очень неправильное, поскольку выбираются уникальные транспортные средства, но их временные метки означают, что они не являются ни самыми ранними, ни самыми последними записями. Я MySQL n00b, пожалуйста, не судите!

http://code.google.com/apis/maps/articles/phpsqlsearch.html - это пример Google для определения местоположения магазина, но с уникальными записями магазина.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2011

Вот что решило мою проблему.

В операторе SELECT я использовал (благодаря @symcbean):

MAX(`EventData`.`timestamp`)

Это избавило от необходимости использовать предложение Order By (которое все равно не работало). Тем не менее, запрос все еще был медленным и занимал более 500 мс для выполнения при использовании большого количества ЦП. Поэтому я вычислил текущую временную метку и 6-дневную временную метку в PHP, а затем выполнил запрос, вуаля! Только 200 мс и оптимальное использование процессора!

Точность. к выводу данных EXPLAIN он также использует временную таблицу и сортировку файлов.

Эта ссылка может помочь получить еще более оптимальный запрос с помощью "внутреннего соединения" и т. Д., Но я не уверен, как это сделать! http://kristiannielsen.livejournal.com/6745.html

0 голосов
/ 13 декабря 2011

Попробуйте отсортировать по

ORDER BY MAX(`EventData`.`timestamp`) DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...