Я не знаю, как решить простую проблему. Моя MySQL База данных содержит данные о сборе точек широты и долготы. Моя цель - вычислить расстояние и направление во время обновления строки.
Это то, что я вставляю прямо сейчас:
INSERT INTO positions
(NAME,
lat,
longitude,
update_at)
VALUES ( 'Object 1',
'50.123456',
'20.123456',
'2020-05-27 18:07:26')
Этот запрос обновляется каждую минуту, но есть много отдельных предметов. Чтобы упростить задачу, я реализую ON DUPLICATE KEY UPDATE
.
Сейчас запрос выглядит следующим образом:
INSERT INTO positions
(
NAME ,
latitude ,
longitude ,
update_at
)
VALUES
(
'Object 1' ,
'50.123456' ,
'20.123456' ,
'2020-05-27 18:07:26'
)
ON DUPLICATE KEY UPDATE
name = VALUES(NAME),
lat = VALUES(latitude),
lon = VALUES(longitude),
update_at = VALUES(update_at)
Это момент, когда я хочу сначала сохранить old_latitude
и old_longitude
значения во время обновления. Первый вопрос:
Как получить старое значение во время ON DUPLICATE KEY UPDATE
?
Я хочу сохранить эти данные, потому что иногда я не хочу загружать старые значения . Особенно, когда расстояние между двумя точками меньше, чем, например, 10 метров.
Если значение имеет большее расстояние, я хочу рассчитать направление.
Общий вопрос в том, как проще всего реализовать этот случай в запросе MySQL?
Я буду рад вашим предложениям или помощи! :)
РЕДАКТИРОВАТЬ: Простой шаг за шагом Пример минимальной воспроизводимости:
Таблица:
CREATE TABLE Positions (
name VCHAR(128) PRIMARY KEY,
lat DOUBLE(30) NOT NULL,
lon DOUBLE(30) NOT NULL,
update_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
Первый шаг:
INSERT INTO positions
(NAME,
lat,
longitude,
update_at)
VALUES
( 'Obj1'
, '50.123456'
, '20.123456'
, '2020-05-27 10:00:00')
ON DUPLICATE KEY
UPDATE name = VALUES(name)
, latitude = VALUES(lat)
, longitude = VALUES(lon)
, update_at = VALUES(update_at)
, IF(distance(VALUES(lat), VALUES(lon), OLD_VALUES(lat), OLD_VALUES(lon)>10, (
old_lat = OLD_VALUES(lat)
, old_lon = OLD_VALUES(lon),
, dir = direction(VALUES(lat), VALUES(lon), OLD_VALUES(lat), OLD_VALUES(lon))
))
Результат:
-----------------------------------------------------------
| name | lat | lon | update_at | old_lat | old_lon| dir |
-----------------------------------------------------------
| Obj1 | 50.1 | 21.1 |2020-05-27 | 0 | 0 | 0 |
| | | | 10:00:00 | | | |
-----------------------------------------------------------
Второй шаг:
INSERT INTO positions
(NAME,
lat,
longitude,
update_at)
VALUES
( 'Obj1'
, '52.123456'
, '25.123456'
, '2020-05-27 11:00:00'),
( 'Obj2'
, '32.123456'
, '15.123456'
, '2020-05-27 12:00:00'),
ON DUPLICATE KEY
UPDATE name = VALUES(name)
, latitude = VALUES(lat)
, longitude = VALUES(lon)
, update_at = VALUES(update_at)
, IF(distance(VALUES(lat), VALUES(lon), OLD_VALUES(lat), OLD_VALUES(lon)>10, (
old_lat = OLD_VALUES(lat)
, old_lon = OLD_VALUES(lon),
, dir = direction(VALUES(lat), VALUES(lon), OLD_VALUES(lat), OLD_VALUES(lon))
))
Результат:
-----------------------------------------------------------
| name | lat | lon | update_at | old_lat | old_lon| dir |
-----------------------------------------------------------
| Obj1 | 52.1 | 25.1 |2020-05-27 | 50.1 | 21.1 | 20 |
| | | | 11:00:00 | | | |
---------------------------------------------------------
| Obj2 | 32.1 | 15.1 |2020-05-27 | 0 | 0 | 0 |
| | | | 12:00:00 | | | |
-----------------------------------------------------------
Третий шаг:
INSERT INTO positions
(NAME,
lat,
longitude,
update_at)
VALUES
( 'Obj1'
, '52.987654'
, '25.987654'
, '2020-05-27 13:00:00'),
ON DUPLICATE KEY
UPDATE name = VALUES(name)
, latitude = VALUES(lat)
, longitude = VALUES(lon)
, update_at = VALUES(update_at)
, IF(distance(VALUES(lat), VALUES(lon), OLD_VALUES(lat), OLD_VALUES(lon)>10, (
old_lat = OLD_VALUES(lat)
, old_lon = OLD_VALUES(lon),
, dir = direction(VALUES(lat), VALUES(lon), OLD_VALUES(lat), OLD_VALUES(lon))
))
Результат:
-----------------------------------------------------------
| name | lat | lon | update_at | old_lat | old_lon| dir |
-----------------------------------------------------------
| Obj1 | 52.9 | 25.9 |2020-05-27 | 50.1 | 21.1 | 20 |
| | | | 13:00:00 | | | |
-----------------------------------------------------------
| Obj2 | 32.1 | 15.1 |2020-05-27 | 0 | 0 | 0 |
| | | | 12:00:00 | | | |
-----------------------------------------------------------