我正在使用以下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;
问题是您不能distance在selectorwhere子句中引用别名列(在这种情况下)。例如,您不能执行以下操作:
distance
select
where
select a, b, a + b as NewCol, NewCol + 1 as AnotherCol from table where NewCol = 2
这将在以下两个方面均失败:select尝试处理时的语句NewCol + 1以及where尝试处理时的语句NewCol = 2。
NewCol + 1
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,这将导致全表扫描。根据要处理的数据量,您可能希望避免这种情况,而是选择第一个选项,该选项应能更快地执行。