Amarok, PHP для меня неродной язык, поэтому советую отнестись к моему предложению с осторожностью.
Вот, переделал скрипт.
Отличия:
оптимизирует только неизвестные локации в отличие от исходного.
Сейчас в нем все операции удаления из базы закомментированы, он только выводит сообщения о предполагаемом удалении.
Выводится ID записи для удаления "to delete ID"
ID записи видно из запроса
SELECT gpslog.ID, gpslog.LAT, gpslog.LON, gpslog.DEVICEID, gpslog.LOCATION_ID, gpsdevices.ID AS GPS_DEVICE_ID FROM gpslog LEFT JOIN gpsdevices ON gpslog.DEVICE_ID = gpsdevices.ID WHERE gpslog.LOCATION_ID =0 ORDER BY gpslog.DEVICEID, gpslog.ADDED DESC
Если устроит результат, снимите комментарии в строках //SQLExec("DELETE
На своих данных при округлении до 3 проверить не получается
Код: Выделить всё
set_time_limit(6000);
$records=SQLSelect("SELECT gpslog.ID, gpslog.LAT, gpslog.LON, gpslog.DEVICEID, gpslog.LOCATION_ID, gpsdevices.ID AS GPS_DEVICE_ID FROM gpslog LEFT JOIN gpsdevices ON gpslog.DEVICE_ID = gpsdevices.ID WHERE gpslog.LOCATION_ID =0 ORDER BY gpslog.DEVICEID, gpslog.ADDED DESC");
$total=count($records);
echo " total=".$total." <br />";
echo "-------------------- <br />";
$to_delete=array();
for($i=1;$i<$total-1;$i++) {
if (!$records[$i]['GPS_DEVICE_ID']) {
//SQLExec("DELETE FROM gpslog WHERE ID=".$records[$i]['ID']);
echo "delete records with unknown DEVICE_ID ID=".$records[$i]['ID']." <br />";
continue;
}
echo "-------------------- <br />";
echo "ID=".$records[$i]['ID']." GPS_DEVICE_ID=".$records[$i]['GPS_DEVICE_ID']." <br />";
echo "LON round i=".round($records[$i]['LON'],3)." i+1=".round($records[$i+1]['LON'],3)." i-1=".round($records[$i-1]['LON'],3)." <br />";
echo "LAT round i=".round($records[$i]['LAT'],3)." i+1=".round($records[$i+1]['LAT'],3)." i-1=".round($records[$i-1]['LAT'],3)." <br />";
if (round($records[$i]['LON'],3)==round($records[$i+1]['LON'],3) && round($records[$i]['LON'],3)==round($records[$i-1]['LON'],3) && round($records[$i]['LAT'],3)==round($records[$i+1]['LAT'],3) && round($records[$i]['LAT'],3)==round($records[$i-1]['LAT'],3))
{
//SQLExec("DELETE FROM gpslog WHERE ID=".$records[$i]['ID']);
echo "to delete ID=".$records[$i]['ID']." <br />";
}
if ($i%200==0) {
//echo ".";
//echo str_repeat(' ', 1024);
flush();
flush();
}
}