我有两个表,用户和地点,latitude
和longitude
。对于每个地方,我想总结距离它不到x距离的用户。
这样做的一种可能方法是循环。还有其他办法吗?我怎样才能在普通SQL
?
编辑:
User(id, name, latitude, longitude)
Place(id, name, latitude, longitude)
答案 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上搜索现有问题,我知道这个问题已被多次回答。)