Je hoeft alleen maar een self-join uit te voeren. Deelnemen tabellen is een zeer fundamenteel onderdeel van SQL - u echt zou het moeten lezen voordat u dit antwoord verder probeert te begrijpen.
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
Bekijk het op sqlfiddle .
Het zal je zijn opgevallen dat ik MySQL's IN()
operator als afkorting voor value = A OR value = B OR ...
.
Het zal je ook zijn opgevallen dat ik MySQL's DEGREES()
en RADIANS()
functies in plaats van dergelijke conversies expliciet uit te voeren.
U vermenigvuldigde toen de breedtegraad met een factor 1.851999999962112
, wat nogal vreemd was:het is extreem dicht bij 1.852
, wat het exacte aantal kilometers in een zeemijl is (historisch gedefinieerd als een minuut breedtegraad), maar toch bizar iets anders - ik nam aan dat je dat in plaats daarvan wilde gebruiken.
Ten slotte had je de letterlijke waarde waarmee je de afstanden in de resultatenset filterde als een string, d.w.z. '60'
, terwijl dit uiteraard een numerieke waarde is en niet aangehaald mag worden.