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.