我正在尝试完成对此 Google tutorial 的修改
我编写了此 SQL 来使用位置“名称”查询位置表。给定位置名称,查询将返回附近的披萨餐厅。为了实现这一目标,我交叉连接了我的餐厅位置表,将其标题为“标记”,并使用半正弦公式计算距离。
SELECT m.address,
m.name,
m.lat,
m.lng,
(3959 * ACOS(COS(RADIANS(poi.lat)) *
COS(RADIANS(m.lat)) *
COS(RADIANS(m.lng) - RADIANS(poi.lng)) + SIN(RADIANS(poi.lat))*
SIN(RADIANS(m.lat)))) AS distance
FROM markers poi
CROSS JOIN markers m
WHERE poi.address LIKE "%myrtle beach%"
AND poi.id <> m.id HAVING distance < 200
ORDER BY distance LIMIT 0,20
查询返回预期结果,但如果兴趣点位于指定区域之外,在本例中为“默特尔比奇”,则每次匹配我都会得到重复的记录。这是因为 CROSS JOIN 可以通过 DISTINCT 选择轻松修复。但“lng”和“lat”字段是 FLOAT 类型,因此距离计算永远不会相同,即使对于重复的记录也是如此。
以下是返回的一部分:
3901 North Kings Highway Suite 1,默特尔比奇,南卡罗来纳州 |芝加哥东部披萨公司| 33.716099 -78.855583 | 4.0285562196955125
1706 S Kings Hwy # A,默特尔比奇,SC |达美乐披萨:默特尔比奇 | 33.674881 | -78.905144 | -78.905144 4.0285562196955125
南卡罗来纳州查尔斯顿温特沃斯街 82 号 |安多里尼斯披萨| 2.782330 | -79.934235 | -79.934235 85.68177495224947
南卡罗来纳州查尔斯顿温特沃斯街 82 号 |安多里尼斯披萨| 32.782330 | -79.934235 | -79.934235 89.71000040441085
南卡罗来纳州埃迪斯托岛丛林路 114 号 |埃迪斯托比奇公司的雄鹿披萨| 32.503971 -80.297951 | 114.22243529200529
南卡罗来纳州埃迪斯托岛丛林路 114 号 |埃迪斯托比奇公司的雄鹿披萨| 32.503971 -80.297951 | 118.2509427998286"
关于从这里去哪里有什么建议吗?
最佳答案
尝试:
select distinct x.address, x.name, y.lat, y.lng, x.distance
from (SELECT m.address,
m.name,
m.lat,
m.lng,
(3959 *
ACOS(COS(RADIANS(poi.lat)) * COS(RADIANS(m.lat)) *
COS(RADIANS(m.lng) - RADIANS(poi.lng)) +
SIN(RADIANS(poi.lat)) * SIN(RADIANS(m.lat)))) AS distance
FROM markers poi
cross JOIN markers m
WHERE poi.address LIKE "%myrtle beach%"
and poi.id <> m.id HAVING distance < 200) x
join markers y
on x.address = y.address
and x.name = y.name
and x.lat = y.lat
and x.lng = y.lng
order by x.distance limit 0, 20
关于mysql - 使用交叉联接和 Hversine 公式在 MySQL 地理搜索中删除重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21959616/