与使用Haversine公式的两个坐标表MySQL最匹配

时间:2017-11-23 02:56:08

标签: mysql join recursion subquery geospatial

我认为这更像是一个子查询\加入问题,而不是地理空间问题。

基本上我有两张桌子。一个表是结构化的

EVENTS
ID | LAT | LNG | 

第二张表是

POI 
|POIID | LAT | LNG | 

以下查询适用于给定坐标以返回最近的POI

SELECT 
poiid,  
(
   6371 *
   acos(cos(radians(-32.8857)) * 
   cos(radians(lat)) * 
   cos(radians(lng) - 
   radians(151.7661)) + 
   sin(radians(-32.8857)) * 
   sin(radians(lat)))
) AS distance 
FROM POI
=ORDER BY distance LIMIT 1;

我想要的几乎是在Events表上递归的东西,基本上给我一个输出

OUTPUT

    |ID| LAT | LONG | *Closest* POIID | 

我试图在选择查询中执行此操作

`Select A.ID, A.LAT, A.LONG (SELECT the Haversine formula with A.LAT and  A.LONG) from EVENTS A`

但MySQL,或者我相信任何SQL都不能在select中的select上做多个返回值,而且我认为这里有一个关于select的计算问题?

希望这是有道理的;任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我不知道有什么方法可以做到这一点,如果不进行表格的完全外部连接以制作所有距离的列表 - 这是空间密集型的 - 然后将其连接到自身以选择每个事件的最小值 - 这是计算密集型的。以下内容应该有效,但可能无法很好地扩展:

WITH distances AS ( SELECT p.poiid, e.id, p.lat AS lat, p.lng AS lng, ( 6371 * acos(cos(radians(p.lat)) * cos(radians(e.lat)) * cos(radians(e.lng) - radians(p.lng)) + sin(radians(p.lat)) * sin(radians(e.lat))) ) AS distance FROM poi p CROSS JOIN events e ) SELECT * FROM distances d1 INNER JOIN (SELECT MIN(distance) AS min_dis, id FROM distances GROUP BY id) d2 ON d1.id = d2.id AND d1.distance = d2.min_dis;