【问题标题】:Select towns that have nearby things选择附近有东西的城镇
【发布时间】:2015-07-08 10:46:30
【问题描述】:

我有 2 个类似于下面示例的表,townsthings,并且需要获取附近的城镇列表,这些城镇的附近事物在距离该城镇记录的 x 范围内。经纬度将用于计算距离。

我查看了其他一些问题,并设法从 things 获取单个指定城镇的记录,但想不出如何获取附近有 things 的所有城镇的列表。 x与他们的距离。

能够按x 距离内的附近事物数量对生成的城镇进行排序将是一个奖励。

TOWNS
+--------+----------+---------+---------+
| townId | townName | townLat | townLng |
+--------+----------+---------+---------+
|      1 | town a   |     1.5 |     1.9 |
|      2 | town b   |     1.4 |     3.8 |
|      3 | town c   |     2.3 |     2.7 |
|      4 | town d   |     3.2 |     1.6 |
|    ... | ...      |     ... |     ... |
+--------+----------+---------+---------+

THINGS
+---------+-----------+----------+----------+
| thingId | thingName | thingLat | thingLng |
+---------+-----------+----------+----------+
|       1 | thing a   | 2.1      | 3.1      |
|       2 | thing b   | 1.1      | 2.3      |
|       3 | thing c   | 3.2      | 0.2      |
|       4 | thing d   | 1.3      | 1.1      |
|     ... | ...       | ...      | ...      |
+---------+-----------+----------+----------+

提前致谢

【问题讨论】:

  • 这里最大的问题是使用Haversine公式来确定两组纬度/经度对之间的距离。你有没有做过这方面的工作?
  • 使用该模式,任何解决方案对于超过几千行都会变得非常缓慢。您基本上必须计算从每个城镇到每个事物的距离。
  • 还没有 - 我不知道从哪里开始。我似乎无法理解如何将公式应用于单个查询中两个表的坐标。
  • @Vatev - 对替代品有什么建议吗?

标签: mysql distance


【解决方案1】:

您可以通过CROSS JOIN 获取城镇和事物的所有可能组合,然后计算每个城镇和事物之间的Haversine 距离。我使用SELECT DISTINCT 来确保城镇只在结果集中列出一次。

SELECT DISTINCT TOWNS.townName FROM
TOWNS CROSS JOIN THINGS
WHERE 3959 * acos( 
  cos(radians( TOWNS.townLat ))
* cos(radians( THINGS.thingLat ))
* cos(radians( TOWNS.townLng ) - radians( THINGS.thingLng ))
+ sin(radians( TOWNS.townLat )) 
* sin(radians( THINGS.thingLat ))
) < x

我使用的公式是 x 以英里为单位(地球的平均半径是 3959 英里)。

【讨论】:

  • 这就是我现在需要的。谢谢!
猜你喜欢
  • 2013-07-24
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多