Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Usando a cláusula WHERE para encontrar POI dentro de um intervalo de distância de Longitude e Latitude


O problema é que você não pode referenciar uma coluna com alias (distance neste caso) em um select ou where cláusula. Por exemplo, você não pode fazer isso:
select a, b, a + b as NewCol, NewCol + 1 as AnotherCol from table
where NewCol = 2

Isso falhará em ambos:o select declaração ao tentar processar NewCol + 1 e também no where declaração ao tentar processar NewCol = 2 .

Existem duas maneiras de resolver isso:

1) Substitua a referência pelo próprio valor calculado. Exemplo:
select a, b, a + b as NewCol, a + b + 1 as AnotherCol from table
where  a + b = 2

2) Use um select externo demonstração:
select a, b, NewCol, NewCol + 1 as AnotherCol from (
    select a, b, a + b as NewCol from table
) as S
where NewCol = 2

Agora, dada a sua coluna calculada ENORME e não muito amigável :) Eu acho que você deve ir para a última opção para melhorar a legibilidade:
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 o @Kaii mencionou abaixo, isso resultará em uma verificação completa da tabela. Dependendo da quantidade de dados que você processará, você pode querer evitar isso e ir para a primeira opção, que deve ter um desempenho mais rápido.