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

Como obter uma lista de subúrbios ao redor de um local e repetir para outros locais usando o MySql?


Você simplesmente precisa realizar uma auto-junção. Participando tabelas é um muito parte fundamental do SQL—você realmente deve ler sobre isso antes de tentar entender esta resposta ainda mais.
SELECT   poi.asciiname,
         suburb.asciiname,
         suburb.country,
         DEGREES(
           ACOS(
             SIN(RADIANS(   poi.latitude))
           * SIN(RADIANS(suburb.latitude))
           + COS(RADIANS(   poi.latitude))
           * COS(RADIANS(suburb.latitude))
           * COS(RADIANS(poi.longitude - suburb.longitude))
           )
         ) * 60 * 1.852 AS distance
FROM     geoname AS poi
    JOIN geoname AS suburb
WHERE    poi.asciiname IN ('Tamworth', 'Birmingham', 'Roanoke')
     AND poi.population > 0
     AND poi.fcode = 'PPL'
     AND suburb.fcode IN ('PPLX', 'PPPL')
HAVING   distance <= 60
ORDER BY poi.asciiname, distance

Veja em sqlfiddle .

Você deve ter notado que eu usei o IN() operador como um atalho para value = A OR value = B OR ... .

Você também deve ter notado que eu usei o DEGREES() e RADIANS() funções em vez de tentar realizar tais conversões explicitamente.

Você estava multiplicando minutos de latitude por um fator de 1.851999999962112 , o que foi bastante estranho:é extremamente próximo de 1.852 , que é o número preciso de quilômetros em uma milha náutica (historicamente definida como um minuto de latitude), mas ainda assim estranhamente um pouco diferente - presumi que você pretendia usar isso.

Por fim, você tinha o valor literal pelo qual estava filtrando as distâncias no conjunto de resultados como uma string, ou seja, '60' , enquanto obviamente este é um valor numérico e deve ser sem aspas.