mysql如何更新从同一个表中的子查询的列?

标签: sql MySQL
发布时间: 2017/1/9 22:21:44
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

为缓存的原因,我需要写入公里 (公里) 外地回位置表,到目前为止我是能够计算公里一切我想目前为止 (更新与工会、 子查询等) 给我 SQL 错误 1093年。

在 MySQL,如何更新的 Km 值回到谈判桌?

这是表架构

CREATE TABLE `locations` (
  `epoch_date` int(10) unsigned DEFAULT NULL,
  `latitude` float NOT NULL,
  `longitude` float NOT NULL,
  `km` float DEFAULT NULL
);

INSERT INTO `locations` (`epoch_date`, `latitude`, `longitude`, `km`) VALUES
(1429913506, -8.7285, 119.401, NULL),
(1429913631, -9.1279, 117.67, NULL),
(1429945707, -8.7063, 119.36, NULL),
(1431929523, -8.5745, 119.707, NULL),
(1431941343, -8.5773, 119.713, NULL),
(1431958383, -8.5881, 119.724, NULL),
(1431969963, -8.589, 119.728, NULL),
(1431998403, -8.5766, 119.724, NULL);

这是选择的查询生成 KM (公里)

SELECT
    latitude
    , longitude
    , epoch_date
    , @latitude2 :=
    (
        SELECT
            latitude
        FROM locations loc1
        WHERE
            loc1.epoch_date < loc.epoch_date
        ORDER BY epoch_date DESC LIMIT 1 OFFSET 0
    ) as prev_latitude
    , @longitude2 :=
    (
        SELECT
            longitude
        FROM locations loc1
        WHERE
            loc1.epoch_date < loc.epoch_date
        ORDER BY epoch_date DESC LIMIT 1 OFFSET 0
    ) as prev_longitude
    , (ACOS(COS(RADIANS(90-latitude)) *COS(RADIANS(90-@latitude2)) +SIN(RADIANS(90-latitude)) *SIN(RADIANS(90-@latitude2)) *COS(RADIANS(longitude-@longitude2))) *6371) as km
FROM locations loc
ORDER BY epoch_date

这里是一个链接到 SQL 小提琴http://sqlfiddle.com/# ! 9/7f95de/2/0

解决方法 1:

首先,你使用了变量 select 语句不能保证工作。 MySQL 并不能保证在表达式的排序 select ,所以可以以任意顺序指定变量。 根据计算的顺序是危险的。

一旦你解决这个问题 (可能通过使用子查询),您可以更新 km 通过使用子查询的列︰

update locations l join
       (<your query here>) u
       on l.latitude = u.latitude and l.longitude = u.longitude
    set l.km = u.km;

哦,我也看到其他危险的事物。 您正在使用浮点数的 lat 和长时间的表示形式。 你应该真正使用小数,通常有点像 decimal(10, 6) 是足以达到这个目的。

官方微信
官方QQ群
31647020