Po prostu musisz wykonać samodołączenie. Dołączanie tabele to bardzo podstawowa część SQL — naprawdę powinien przeczytać o tym przed próbą dalszego zrozumienia tej odpowiedzi.
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
Zobacz go na sqlfiddle .
Zauważyłeś, że użyłem IN()
operator jako skrót dla value = A OR value = B OR ...
.
Zauważyłeś również, że użyłem DEGREES()
i RADIANS()
funkcji, zamiast próbować jawnie przeprowadzać takie konwersje.
Mnożyłeś wtedy minuty szerokości geograficznej przez współczynnik 1.851999999962112
, co było dość dziwne:jest bardzo blisko 1.852
, czyli dokładna liczba kilometrów w mili morskiej (historycznie definiowana jako minuta szerokości geograficznej), ale dziwnie nieco inna — założyłem, że zamierzasz użyć tego zamiast.
Na koniec otrzymałeś wartość dosłowną, według której filtrowałeś odległości w zestawie wyników jako ciąg, tj. '60'
, podczas gdy oczywiście jest to wartość liczbowa i nie powinno być cytowane.