MySQL - При дублировании ключа обновить другой столбец со старым значением столбца - PullRequest
0 голосов
/ 27 мая 2020

Я не знаю, как решить простую проблему. Моя 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  |         |        |     |
-----------------------------------------------------------
...