我正在尝试找到附近的分支机构,这些分支机构可以提供我们的客户(company_id)位置列表。这两个表(客户的位置和我们的'分支')都有索引lat / lng字段。此MySQL查询使用hasrsine公式,并返回每个位置25英里内的所有分支。
select locations.id,locations.street, locations.city, locations.state,branches.id, branchname,branches.city,branches.state,
(3956 * acos(cos(radians(locations.lat))
* cos(radians(branches.lat))
* cos(radians(branches.lng)
- radians(locations.lng))
+ sin(radians(locations.lat))
* sin(radians(branches.lat)))) as branchdistance
from locations
left join branches on
(3956 * acos(cos(radians(locations.lat))
* cos(radians(branches.lat))
* cos(radians(branches.lng)
- radians(locations.lng))
+ sin(radians(locations.lat))
* sin(radians(branches.lat)))) < 25
where locations.company_id = 388
order by locations.id, branchdistance
但是我想限制返回的分支数(左连接)最多为5。 任何帮助将不胜感激。 感谢
答案 0 :(得分:0)
在拉了很多头发之后,终于找到了答案:
select
a.id,
b.id,
st_distance_sphere(a.position, b.position) * 0.00062137119 dist
from addresses a
inner join branches b
on b.id = (
select b1.id
from branches b1
where st_distance_sphere(a.position, b1.position) * 0.00062137119 < 25
order by st_distance_sphere(a.position, b1.position)
limit 1
)
通过解释的方式,我们试图将成千上万的线索(地址)分配给数百个分支中最近的一个,每个分支的服务半径为25英里。
每个表(地址和分支)都有经度,经度和地理空间位置列。
我将原始查询修改为使用MySQL 5.7地理空间函数(st_distance_sphere),但Haversine公式仍然有效。
希望这对某人有价值。