Sie müssen lediglich einen Self-Join durchführen. Beitreten Tabellen ist ein sehr grundlegender Teil von SQL – Sie wirklich sollten sich darüber informieren, bevor Sie versuchen, diese Antwort weiter zu verstehen.
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
Sehen Sie es auf sqlfiddle .
Sie werden bemerkt haben, dass ich IN()
Operator als Kurzform für value = A OR value = B OR ...
.
Sie werden auch bemerkt haben, dass ich MySQLs DEGREES()
und RADIANS()
Funktionen, anstatt zu versuchen, solche Konvertierungen explizit durchzuführen.
Sie haben dann Breitenminuten mit dem Faktor 1.851999999962112
multipliziert , was ziemlich seltsam war:Es liegt sehr nahe an 1.852
, das ist die genaue Anzahl von Kilometern in einer Seemeile (historisch definiert als Breitengradminute), aber dennoch bizarr etwas anders – ich habe angenommen, Sie wollten stattdessen diese verwenden.
Schließlich hatten Sie den Literalwert, nach dem Sie die Entfernungen in der Ergebnismenge als Zeichenfolge gefiltert haben, dh '60'
, wobei dies offensichtlich ein numerischer Wert ist und nicht in Anführungszeichen gesetzt werden sollte.