自己参加を実行する必要があります。 参加 テーブルは非常に 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 でご覧ください 。
MySQLのIN()
value = A OR value = B OR ...
の省略形としての演算子 。
また、MySQLのDEGREES()
およびRADIANS()
そのような変換を明示的に実行しようとするのではなく、機能します。
次に、緯度の分に1.851999999962112
の係数を掛けていました。 、これはかなり奇妙でした。1.852
に非常に近いです。 、これは海里の正確なキロメートル数(歴史的には緯度の1分として定義されています)ですが、奇妙なことにわずかに異なります。代わりにそれを使用するつもりだったと思います。
最後に、結果セット内の距離を文字列としてフィルタリングするためのリテラル値があります。つまり、'60'
、これは明らかに数値であり、引用符で囲まないようにする必要があります。