Mysql限制左连接结果

时间:2018-02-14 16:52:23

标签: mysql geolocation

我正在尝试找到附近的分支机构,这些分支机构可以提供我们的客户(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。 任何帮助将不胜感激。 感谢

1 个答案:

答案 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公式仍然有效。

希望这对某人有价值。