我认为这更像是一个子查询\加入问题,而不是地理空间问题。
基本上我有两张桌子。一个表是结构化的
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的计算问题?
希望这是有道理的;任何帮助将不胜感激。
答案 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;