Просто трябва да извършите самостоятелно присъединяване. Присъединяване таблици е много основна част от SQL – вие наистина трябва да го прочетете, преди да се опитате да разберете този отговор допълнително.
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
Вижте го на sqlfiddle .
Ще сте забелязали, че използвах IN()
оператор като съкращаване на value = A OR value = B OR ...
.
Също така ще сте забелязали, че съм използвал DEGREES()
и RADIANS()
функции, вместо да се опитват да извършват такива преобразувания изрично.
След това умножавахте минутите географска ширина с коефициент 1.851999999962112
, което беше доста странно:той е изключително близо до 1.852
, което е точният брой километри в морска миля (исторически дефиниран като минута на географска ширина), но все пак странно малко по-различен — Предполагам, че сте имали предвид да го използвате вместо това.
И накрая, имахте литералната стойност, по която филтрирате разстоянията в набора от резултати като низ, т.е. '60'
, докато очевидно това е числова стойност и не трябва да се цитира.