mysql - 使用交叉联接和 Hversine 公式在 MySQL 地理搜索中删除重复记录

标签 mysql sql gis cross-join haversine

我正在尝试完成对此 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/

相关文章:

javascript - 如何在Openlayers 3中显示ESRI矢量 basemap

c# - 我可以覆盖 Entity Framework 查询生成器吗?

php - 通过php变量从MySQL选择数据时如何转义单引号

php - PHP 中的搜索功能适用于数值,但不适用于字母/单词

mysql - 如何在 bash 脚本中的 MySQL select 中使用单引号?

MySQL - SELECT ...(子查询)AS 字段名

sql - PostgreSQL - 忽略 LIKE 表达式中的字符序列

java - 您如何将 Java 字符输入 MYSQL 数据库,然后再检索它们?

c# - 为什么这个查询返回-1?

python - 为什么子图的大小不同?