Problemet er, at du ikke kan henvise til en kolonne med alias (distance
i dette tilfælde) i en select
eller where
klausul. Du kan f.eks. ikke gøre dette:
select a, b, a + b as NewCol, NewCol + 1 as AnotherCol from table
where NewCol = 2
Dette vil mislykkes i begge:select
sætning, når du forsøger at behandle NewCol + 1
og også i where
sætning, når du forsøger at behandle NewCol = 2
.
Der er to måder at løse dette på:
1) Erstat referencen med selve den beregnede værdi. Eksempel:
select a, b, a + b as NewCol, a + b + 1 as AnotherCol from table
where a + b = 2
2) Brug en ydre select
erklæring:
select a, b, NewCol, NewCol + 1 as AnotherCol from (
select a, b, a + b as NewCol from table
) as S
where NewCol = 2
Nu, givet din KÆMPE og ikke særlig menneskevenlige beregnede kolonne :) Jeg synes, du skal gå efter den sidste mulighed for at forbedre læsbarheden:
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;
Rediger: Som @Kaii nævnt nedenfor vil dette resultere i en fuld tabelscanning. Afhængigt af mængden af data, du vil behandle, vil du måske undgå det og gå efter den første mulighed, som burde fungere hurtigere.