Problem polega na tym, że nie można odwołać się do kolumny z aliasem (distance
w tym przypadku) w select
lub where
klauzula. Na przykład nie możesz tego zrobić:
select a, b, a + b as NewCol, NewCol + 1 as AnotherCol from table
where NewCol = 2
To się nie powiedzie w obu:select
oświadczenie podczas próby przetworzenia NewCol + 1
a także w where
instrukcja przy próbie przetworzenia NewCol = 2
.
Można to rozwiązać na dwa sposoby:
1) Zastąp odniesienie samą obliczoną wartością. Przykład:
select a, b, a + b as NewCol, a + b + 1 as AnotherCol from table
where a + b = 2
2) Użyj zewnętrznego select
oświadczenie:
select a, b, NewCol, NewCol + 1 as AnotherCol from (
select a, b, a + b as NewCol from table
) as S
where NewCol = 2
Teraz, biorąc pod uwagę twoją OGROMNĄ i niezbyt przyjazną dla człowieka kolumnę obliczeniową :) Myślę, że powinieneś wybrać ostatnią opcję, aby poprawić czytelność:
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;
Edytuj: Jak wspomniano poniżej @Kaii, spowoduje to pełne skanowanie tabeli. W zależności od ilości danych, które będziesz przetwarzać, możesz tego uniknąć i wybrać pierwszą opcję, która powinna działać szybciej.