小编典典

使用WHERE子句在距经度和纬度的距​​离范围内找到POI

sql

我正在使用以下sql代码来找出最接近设置坐标的“所有”
poi,但是我想找出特定的poi而不是所有的poi。当我尝试使用where子句时,我得到一个错误,它不起作用,这是我目前遇到的问题,因为我只使用一张表来表示所有poi的所有坐标。

SET @orig_lat=55.4058;  
SET @orig_lon=13.7907; 
SET @dist=10;
SELECT 
    *, 
    3956 * 2 * ASIN(SQRT(POWER(SIN((@orig_lat -abs(latitude)) * pi()/180 / 2), 2) 
    + COS(@orig_lat * pi()/180 ) * COS(abs(latitude) * pi()/180) 
    * POWER(SIN((@orig_lon - longitude) * pi()/180 / 2), 2) )) as distance 
FROM geo_kulplex.sweden_bobo
HAVING distance < @dist 
ORDER BY distance limit 10;

阅读 215

收藏
2021-03-10

共1个答案

小编典典

问题是您不能distanceselectorwhere子句中引用别名列(在这种情况下)。例如,您不能执行以下操作:

select a, b, a + b as NewCol, NewCol + 1 as AnotherCol from table
where NewCol = 2

这将在以下两个方面均失败:select尝试处理时的语句NewCol + 1以及where尝试处理时的语句NewCol = 2

有两种方法可以解决此问题:

1)将参考值替换为计算值本身。例子:

select a, b, a + b as NewCol, a + b + 1 as AnotherCol from table
where  a + b = 2

2)使用外部select语句:

select a, b, NewCol, NewCol + 1 as AnotherCol from (
    select a, b, a + b as NewCol from table
) as S
where NewCol = 2

现在,考虑到您的计算量很大而不是非常人性化的列:)我想您应该选择最后一种选择来提高可读性:

SET @orig_lat=55.4058;  
SET @orig_lon=13.7907; 
SET @dist=10;

SELECT * FROM (
  SELECT 
    *, 
    3956 * 2 * ASIN(SQRT(POWER(SIN((@orig_lat -abs(latitude)) * pi()/180 / 2), 2) 
    + COS(@orig_lat * pi()/180 ) * COS(abs(latitude) * pi()/180) 
    * POWER(SIN((@orig_lon - longitude) * pi()/180 / 2), 2) )) as distance 
  FROM geo_kulplex.sweden_bobo
) AS S
WHERE distance < @dist
ORDER BY distance limit 10;

编辑: 正如下面提到的@Kaii,这将导致全表扫描。根据要处理的数据量,您可能希望避免这种情况,而是选择第一个选项,该选项应能更快地执行。

2021-03-10