MySQL根据距离表进行数据求和

时间:2016-08-12 14:52:56

标签: mysql sql

我有两个表,用户和地点,latitudelongitude。对于每个地方,我想总结距离它不到x距离的用户。

这样做的一种可能方法是循环。还有其他办法吗?我怎样才能在普通SQL

中实现这一目标

编辑:

User(id, name, latitude, longitude)

Place(id, name, latitude, longitude)

1 个答案:

答案 0 :(得分:0)

似乎一种方法是"用户"的交叉连接。和"地点" (每个"用户"匹配到每个地方。合并一个表达式,计算"用户" lat / long和"地点" lat / long之间的距离( GCD),并将表达式的结果与给定距离" x"进行比较,并根据该比较返回0或1.并使用比较返回的SUM聚合。

例如,像这样:

SELECT p.id
     , p.name
     , IFNULL( SUM( [gcd_expr] <= x ) ,0) AS cnt
  FROM place p
 CROSS
  JOIN user u
 GROUP BY p.id

每个用户都匹配到每个地方,这可能真的很大。这需要计算很多距离,这可能会非常昂贵。

为了提高性能,我们可以包含限制纬度和/或经度增量的连接谓词...假设您只想检查纬度在5度以内的用户...

SELECT p.id
     , p.name
     , IFNULL( SUM( [gcd_expr] <= x ) ,0) AS cnt
  FROM place p
  LEFT
  JOIN user u
    ON u.lat-p.lat BETWEEN -5.00 AND 5.00
 GROUP BY p.id

[gcd_expr]表示执行大圆距离计算的表达式。 (有可用的实现;在StackOverflow上搜索现有问题,我知道这个问题已被多次回答。)