Проблемът е, че не можете да препратите към колона с псевдоним (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
.
Има два начина за решаване на това:
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 спомена по-долу, това ще доведе до пълно сканиране на таблицата. В зависимост от количеството данни, които ще обработвате, може да искате да избегнете това и да изберете първата опция, която трябва да работи по-бързо.