Jednoduše musíte provést vlastní připojení. Připojování tabulky je velmi základní část SQL – vy skutečně měli byste si to přečíst, než se pokusíte dále porozumět této odpovědi.
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
Podívejte se na sqlfiddle .
Určitě jste si všimli, že jsem použil IN()
operátor jako zkratka pro value = A OR value = B OR ...
.
Také jste si všimli, že jsem použil DEGREES()
a RADIANS()
namísto pokusu o explicitní provedení těchto konverzí.
Potom jste vynásobili minuty zeměpisné šířky faktorem 1.851999999962112
, což bylo poněkud zvláštní:je extrémně blízko 1.852
, což je přesný počet kilometrů na námořní míli (historicky definovaná jako minuta zeměpisné šířky), ale přesto je bizarně mírně odlišný – předpokládal jsem, že místo toho chcete použít tento.
Nakonec jste měli doslovnou hodnotu, podle které jste filtrovali vzdálenosti v sadě výsledků, jako řetězec, tj. '60'
, přičemž se zjevně jedná o číselnou hodnotu a neměla by být v uvozovkách.