Mysql
 sql >> Base de données >  >> RDS >> Mysql

Utilisation de la clause WHERE pour trouver un point d'intérêt dans une plage de distance entre la longitude et la latitude

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.