您只需要执行自联接。 连接表是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 distanceFROM geoname AS poi JOIN geoname AS suburbWHERe poi.asciiname IN ('Tamworth', 'Birmingham', 'Roanoke') AND poi.population > 0 AND poi.fpre = 'PPL' AND suburb.fpre IN ('PPLX', 'PPPL')HAVINg distance <= 60ORDER BY poi.asciiname, distance在sqlfiddle上看到它。
您会注意到,我已经使用MySQL的
IN()运算符作为的简写
value = A OR value = B OR ...。
您还会注意到,我使用了MySQL
DEGREES()和
RADIANS()函数,而不是尝试显式执行此类转换。
然后,您将纬度分钟数乘以
1.851999999962112,这是很奇怪的:它非常接近
1.852,这是海里的精确公里数(历史上定义为纬度分钟),但奇怪的是,我已经假设您打算使用它。
最后,您拥有一个字面值,通过该字面值可以将结果集中的距离过滤为字符串,即
'60',而显然这是一个数字值,应不加引号。



