Devi semplicemente eseguire un self-join. Partecipare tabelle è un molto parte fondamentale di SQL:tu davvero dovrebbe leggere su di esso prima di provare a capire ulteriormente questa risposta.
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
Guardalo su sqlfiddle .
Avrai notato che ho utilizzato IN()
operatore come abbreviazione di value = A OR value = B OR ...
.
Avrai anche notato che ho utilizzato DEGREES()
e RADIANS()
funzioni anziché tentare di eseguire tali conversioni in modo esplicito.
Stavi quindi moltiplicando i minuti di latitudine per un fattore di 1.851999999962112
, il che era piuttosto strano:è estremamente vicino a 1.852
, che è il numero preciso di chilometri in una miglio nautico (storicamente definito come un minuto di latitudine), ma stranamente leggermente diverso:ho pensato che tu volessi usarlo invece.
Infine, avevi il valore letterale in base al quale stavi filtrando le distanze nel set di risultati come una stringa, ovvero '60'
, mentre ovviamente questo è un valore numerico e non dovrebbe essere tra virgolette.