Le problème est que vous ne pouvez pas référencer une colonne aliasée (distance
dans ce cas) dans un select
ou where
clause. Par exemple, vous ne pouvez pas faire ceci :
select a, b, a + b as NewCol, NewCol + 1 as AnotherCol from table
where NewCol = 2
Cela échouera dans les deux :le select
déclaration lors de la tentative de traitement de NewCol + 1
et aussi dans le where
instruction lors de la tentative de traitement de NewCol = 2
.
Il existe deux façons de résoudre ce problème :
1) Remplacez la référence par la valeur calculée elle-même. Exemple :
select a, b, a + b as NewCol, a + b + 1 as AnotherCol from table
where a + b = 2
2) Utilisez un select
externe déclaration :
select a, b, NewCol, NewCol + 1 as AnotherCol from (
select a, b, a + b as NewCol from table
) as S
where NewCol = 2
Maintenant, étant donné votre colonne calculée ÉNORME et pas très humaine :) Je pense que vous devriez opter pour la dernière option pour améliorer la lisibilité :
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;
Modifier : Comme @Kaii mentionné ci-dessous, cela se traduira par une analyse complète de la table. En fonction de la quantité de données que vous traiterez, vous voudrez peut-être éviter cela et opter pour la première option, qui devrait fonctionner plus rapidement.