java - java在表0 中为每个位置查找最近的位置

  显示原文与译文双语对照的内容

我现在使用的mySQL数据库有两个表: 一个叫 source 另一个叫 siteinfo

siteinfo表如下所示:


+-----------+----------+----------+


| longitude | latitude | sitecode |


+-----------+----------+----------+


| 1.3009 | 1.900989 | 2 |


+-----------+----------+----------+


| 1.7034 | 1.20034 | 3 |


+-----------+----------+----------+



同样地,源表如下所示:


+-----------+----------+----------+


| longitude | latitude | sitecode |


+-----------+----------+----------+


| 1.3009 | 1.900989 | NULL |


+-----------+----------+----------+



我主要要做的是:

对于 source 表中的每一行,我想获取称为经度和纬度的列,并将它们与 siteinfo 表中对应的经度和纬度列。

源表中的那些行与 siteinfo 表中的那些行最相似,然后使用 siteinfo 表中 sitecode 列的相应 sitecode 更新 sitecode 列。

例如,源表中的长和小数值最接近于 siteinfo 表的第一行,因这里 sitecode 更新为 2.

为了解决这个问题,我知道我必须创建两个结果集和使用时间( 下一步( ) 来循环遍历每一行。 问题是,我如何比较找出最相似的条目?

我想使用循环进行比较,这个源代码结构的第一行与Siteinfo的每一行都增加了一行。

但是,我理解了由 next() 函数对每行进行迭代,这与循环不同,因为我想将一个resultset的第一行与另一个集合的每一行进行比较。

第二,如何找到两个结果表的列条目的差异?

时间: 原作者:

不,你不必创建两个结果集。 你可以创建一个MySQL函数来计算两个点之间的大圆距离。


CREATE FUNCTION great_circle_km (lon1 DOUBLE, lat1 DOUBLE, lon2 DOUBLE, lat2 DOUBLE)


RETURNS DOUBLE


RETURN 6371 * acos(cos(radians(lat1)) * cos(radians(lat2)) * cos(radians(lon2) - radians(lon1)) + sin(radians(lat1)) * sin(radians(lat2)))



。然后使用类似这样的更新查询


UPDATE `source` SET `source`.`sitecode` = (


 SELECT `sitecode` FROM `siteinfo`


 ORDER BY great_circle_km(`source`.`longitude`, `source`.`latitude`, `siteinfo`.`longitude`, `siteinfo`.`latitude`)


 LIMIT 1


 )



注意,上面 查询将执行交叉 Join ( 笛卡尔乘积)的等效性,因这里处理的有效行数将大大增加。 例如使用两个 500-row 表将有效地处理 250,000行,使用两个 5,000 -row表将有效处理 25,000行,000行。

如果表之间有大量的精确匹配,那么先更新它们可以能会更快。


UPDATE 


 `source` 


 INNER JOIN 


 `siteinfo` 


 ON `source`.`longitude` = `siteinfo`.`longitude` 


 AND `source`.`latitude` = `siteinfo`.`latitude`


SET `source`.`sitecode` = `siteinfo`.`sitecode`



。然后更新剩余的行


UPDATE `source` SET `source`.`sitecode` = (


 SELECT `sitecode` FROM `siteinfo`


 ORDER BY great_circle_km(`source`.`longitude`, `source`.`latitude`, `siteinfo`.`longitude`, `siteinfo`.`latitude`)


 LIMIT 1


 )


WHERE `source`.`sitecode` IS NULL



原作者:
...