Problemet är att du inte kan referera till en aliaskolumn (distance
i det här fallet) i en select
eller where
klausul. Du kan till exempel inte göra detta:
select a, b, a + b as NewCol, NewCol + 1 as AnotherCol from table
where NewCol = 2
Detta kommer att misslyckas i båda:select
uttalande när du försöker bearbeta NewCol + 1
och även i where
uttalande när du försöker bearbeta NewCol = 2
.
Det finns två sätt att lösa detta:
1) Ersätt referensen med det beräknade värdet i sig. Exempel:
select a, b, a + b as NewCol, a + b + 1 as AnotherCol from table
where a + b = 2
2) Använd en yttre select
uttalande:
select a, b, NewCol, NewCol + 1 as AnotherCol from (
select a, b, a + b as NewCol from table
) as S
where NewCol = 2
Nu, med tanke på din ENORMA och inte särskilt människovänliga beräknade kolumn :) Jag tycker att du ska välja det sista alternativet för att förbättra läsbarheten:
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;
Redigera: Som @Kaii nämnde nedan kommer detta att resultera i en fullständig tabellskanning. Beroende på mängden data du kommer att bearbeta kanske du vill undvika det och välja det första alternativet, som bör fungera snabbare.