Проблема в том, что вы не можете ссылаться на столбец с псевдонимом (в данном случае 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
.
Есть два способа решить эту проблему:
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, это приведет к полному сканированию таблицы. В зависимости от объема данных, которые вы будете обрабатывать, вы можете избежать этого и выбрать первый вариант, который должен работать быстрее.
person
Mosty Mostacho
schedule
26.02.2012