Du skal blot udføre en selv-join. Deltager tables er en meget grundlæggende del af SQL – du virkelig bør læse op på det, før du forsøger at forstå dette svar yderligere.
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 bemærket, at jeg har brugt MySQL's IN()
operator som en forkortelse for value = A OR value = B OR ...
.
Du har også bemærket, at jeg har brugt MySQL's DEGREES()
og RADIANS()
fungerer i stedet for at forsøge at udføre sådanne konverteringer eksplicit.
Du multiplicerede så minutter af breddegrad med en faktor på 1.851999999962112
, hvilket var ret mærkeligt:det er ekstremt tæt på 1.852
, som er det præcise antal kilometer i en sømil (historisk defineret som et minuts breddegrad), men alligevel bizart lidt anderledes – jeg har antaget, at du ville bruge det i stedet for.
Endelig havde du den bogstavelige værdi, som du filtrerede afstandene i resultatsættet med som en streng, dvs. '60'
, hvorimod dette naturligvis er en numerisk værdi og bør være uden anførselstegn.