sql >> Base de Datos >  >> RDS >> Mysql

Uso de la cláusula WHERE para encontrar PDI dentro de un rango de distancia de longitud y latitud

El problema es que no puede hacer referencia a una columna con alias (distance en este caso) en un select o where cláusula. Por ejemplo, no puedes hacer esto:

select a, b, a + b as NewCol, NewCol + 1 as AnotherCol from table
where NewCol = 2

Esto fallará en ambos:el select declaración al intentar procesar NewCol + 1 y también en el where declaración al intentar procesar NewCol = 2 .

Hay dos formas de resolver esto:

1) Reemplazar la referencia por el propio valor calculado. Ejemplo:

select a, b, a + b as NewCol, a + b + 1 as AnotherCol from table
where  a + b = 2

2) Use un select externo declaración:

select a, b, NewCol, NewCol + 1 as AnotherCol from (
    select a, b, a + b as NewCol from table
) as S
where NewCol = 2

Ahora, dada su columna calculada ENORME y no muy amigable para los humanos :) Creo que debería optar por la última opción para mejorar la legibilidad:

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;

Editar: Como @Kaii mencionó a continuación, esto dará como resultado un escaneo completo de la tabla. Dependiendo de la cantidad de datos que procesará, es posible que desee evitar eso y optar por la primera opción, que debería funcionar más rápido.