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.