問題は、エイリアス列(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
を処理しようとしたときのステートメント 。
これを解決するには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が以下で説明するように、これは全表スキャンになります。処理するデータの量によっては、それを避けて、より高速に実行される最初のオプションを選択することをお勧めします。