首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL中大圆距离的计算与分组

MySQL中大圆距离的计算与分组
EN

Stack Overflow用户
提问于 2013-01-24 04:56:30
回答 2查看 400关注 0票数 1

我有两个表,其中一个大致如下:

代码语言:javascript
运行
复制
client_ip  server_ip  speed
---------  ---------  -----
1.2.3.4    9.1.2.3    100
1.2.3.5    9.1.2.3    1033

和另一个有地理数据的:

代码语言:javascript
运行
复制
ip       latitude    longitude
-------  --------    ---------
1.2.3.4  13.75       100.21
1.2.3.5  21.1234     141.21
9.1.2.3  13.75       99.21

我想写一个select查询,它计算出两个IP地址之间的大圆圈距离,按它分组,并计算平均速度。因此,例如,理想的输出应该是这样的:

代码语言:javascript
运行
复制
distance  avg(speed)
--------  ----------
21        99
100       1234

虽然我知道在SQL中有关于获得大圆距离的good resources out there,但我对如何有效地连接这两个表感到有点困惑,因为这两个表都相当大(数百万行)。

有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-24 06:13:57

假设地理数据表中的it是唯一的,那么这实际上不是一个非常昂贵的连接。即使您连接的表的server_ip列中的值不是唯一的,您也不必告诉系统它是一个外连接--对于“速度”表中的每一行,IP表中将有且仅有一个条目与client_ip匹配,IP表中有且仅有一个条目与server_ip匹配。因此,您可以毫不费力地使用内部连接。

代码语言:javascript
运行
复制
SELECT <c.client_ip to s.server_ip distance calc> AS Distance, AVG(sp.speed) AS AvgSpeed
FROM speedTable sp JOIN geoTable c
    ON sp.client_ip = c.client_ip JOIN geoTable s
    ON sp.server_ip = s.server_ip
WHERE 1 = 1 --whatever your where clause is
GROUP BY <c.client_ip to s.server_ip distance calc>
票数 1
EN

Stack Overflow用户

发布于 2013-01-24 06:14:38

嗯,连接可能不是这个查询中最慢的部分,它将是每一行的距离计算……

代码语言:javascript
运行
复制
SELECT
  client_ip,
  server_ip,
  avg(speed),
  {your distance calculation} AS distance
FROM 
  speeds
  JOIN geo AS geo_client ON geo_client.ip=speeds.client_ip 
  JOIN geo AS geo_server ON geo_server.ip=speeds.server_ip
GROUP BY
  distance

这是您的连接,但请注意,距离计算是在每一行上完成的,有数百万行,您将在那里受到很大影响。你可以尝试一些东西,也许可以看看其他的帖子:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14489213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档