Das Problem ist, dass Sie nicht auf eine Alias-Spalte verweisen können (distance
in diesem Fall) in einem select
oder where
Klausel. Folgendes ist beispielsweise nicht möglich:
select a, b, a + b as NewCol, NewCol + 1 as AnotherCol from table
where NewCol = 2
Dies wird in beiden fehlschlagen:dem select
-Anweisung beim Versuch, NewCol + 1
zu verarbeiten und auch im where
-Anweisung beim Versuch, NewCol = 2
zu verarbeiten .
Es gibt zwei Möglichkeiten, dies zu lösen:
1) Ersetzen Sie die Referenz durch den berechneten Wert selbst. Beispiel:
select a, b, a + b as NewCol, a + b + 1 as AnotherCol from table
where a + b = 2
2) Verwenden Sie ein äußeres select
Aussage:
select a, b, NewCol, NewCol + 1 as AnotherCol from (
select a, b, a + b as NewCol from table
) as S
where NewCol = 2
Nun, angesichts Ihrer RIESIGEN und nicht sehr menschenfreundlich berechneten Spalte :) Ich denke, Sie sollten sich für die letzte Option entscheiden, um die Lesbarkeit zu verbessern:
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;
Bearbeiten: Wie @Kaii unten erwähnt, führt dies zu einem vollständigen Tabellenscan. Abhängig von der Datenmenge, die Sie verarbeiten, sollten Sie dies möglicherweise vermeiden und sich für die erste Option entscheiden, die schneller ausgeführt werden sollte.