Du behöver helt enkelt utföra en självanslutning. Gå med tabeller är en mycket grundläggande del av SQL – du verkligen bör läsa på det innan du försöker förstå det här svaret ytterligare.
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
Se den på sqlfiddle .
Du har märkt att jag har använt MySQL:s IN()
operator som en förkortning för value = A OR value = B OR ...
.
Du har också märkt att jag har använt MySQL:s DEGREES()
och RADIANS()
fungerar snarare än att försöka utföra sådana konverteringar explicit.
Du multiplicerade då latitudminuter med en faktor 1.851999999962112
, vilket var ganska konstigt:det är extremt nära 1.852
, som är det exakta antalet kilometer i en sjömil (historiskt definierat som en minut av latitud), men ändå konstigt nog något annorlunda – jag har antagit att du menade att använda det istället.
Slutligen hade du det bokstavliga värdet med vilket du filtrerade avstånden i resultatuppsättningen som en sträng, dvs. '60'
, medan detta uppenbarligen är ett numeriskt värde och bör vara utan citat.