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

¿Cómo obtener una lista de los suburbios que rodean una ubicación y luego repetir para otras ubicaciones usando MySql?

Simplemente necesita realizar una autounión. Unirse tablas es un muy parte fundamental de SQL—usted realmente debería leerlo antes de tratar de entender más esta respuesta.

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

Véalo en sqlfiddle .

Habrás notado que he usado el IN() operador como abreviatura de value = A OR value = B OR ... .

También habrás notado que he usado DEGREES() y RADIANS() funciones en lugar de intentar realizar tales conversiones explícitamente.

Entonces estabas multiplicando minutos de latitud por un factor de 1.851999999962112 , que era bastante extraño:está muy cerca de 1.852 , que es el número exacto de kilómetros en una milla náutica (históricamente definida como un minuto de latitud), pero extrañamente ligeramente diferente. Supuse que querías usar eso en su lugar.

Finalmente, tenía el valor literal por el cual estaba filtrando las distancias en el conjunto de resultados como una cadena, es decir, '60' , mientras que obviamente este es un valor numérico y no debe estar entrecomillado.