mysql - MySQL - 在重复键上用旧列值更新另一列
问题描述
我不知道如何处理一个简单的问题。我的 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 | | | |
-----------------------------------------------------------
解决方案
推荐阅读
- javascript - 如何在 JavaScript 中的对象中打印两个数组列表
- javascript - 数据在不同组件中到达角度较晚
- php - wordpress phpMyAdmin 数据库集成最佳实践
- node.js - Socket.io + Nodejs + Angular2+ - 缺少 CORS 标头“Access-Control-Allow-Origin”
- php - php symfony 1 更新 generator.yml
- sql - SQL/Power BI 中的迭代构建列
- maven - 搜索 Nexus 中是否存在文件
- javascript - 如何设计一个优雅的 IP 检查 API 来支持 IPv4 和 IPv6
- php - 在 PHP 中将节点添加到 XML
- angular - 角度火力基地错误