MySQL:获取每个唯一位置5英里内的客户总数

MySQL:获取每个唯一位置5英里内的客户总数,mysql,Mysql,我有一个任务,我需要找到数据库中列出的每个地点5英里范围内的客户总数,我不太确定如何做到这一点。当谈到SQL查询时,我有点不知所措,而这个查询有点超出了我的知识范围。我现在有一个查询,将列出一个地点5英里内的所有客户,但我想得到他们所有人的报告。我需要查询显示如下内容: --------------------------- | Store | Customers | | Store1 | 50 | | Store2 | 300 | |

我有一个任务,我需要找到数据库中列出的每个地点5英里范围内的客户总数,我不太确定如何做到这一点。当谈到SQL查询时,我有点不知所措,而这个查询有点超出了我的知识范围。我现在有一个查询,将列出一个地点5英里内的所有客户,但我想得到他们所有人的报告。我需要查询显示如下内容:

---------------------------
| Store    | Customers    |
| Store1   | 50           |
| Store2   | 300          |
| Store3   | 210          |
.          .              . 
.          .              .
---------------------------
my stores表的缩短模式如下所示:

此表由200个条目组成

-------------------------------------------
| ID     | Lat          | Lng            |
| Store1 |43.7011526000 | -98.0822506000 |
| Store2 |42.7011526000 | -95.0822506000 |
.        .              .                .
.        .              .                .
-------------------------------------------
my customers表的缩短模式如下所示:

此表由16K+个条目和增长项组成

----------------------------------------------
| ID        | Lat          | Lng            |
| customer1 |40.7011526000 | -93.0822506000 |
| customer2 |41.7011526000 | -96.0822506000 |
.           .              .                .
.           .              .                .
----------------------------------------------
这是我目前的查询,用于获取我们其中一家商店5英里内的客户总数:

select ID, ( 3959 * acos( cos( radians(43.7011526000) ) * cos( radians( Lat ) ) 
* cos( radians( Lng ) - radians(-98.0822506000) ) + sin( radians(43.7011526000) ) * sin(radians(Lat)) ) ) AS distance from customers having distance <= 5 order by distance;

选择ID,(3959*acos(弧度(43.7011526000))*cos(弧度(纬度))

*cos(radians(Lng)-radians(-98.0822506000))+sin(radians(43.7011526000))*sin(radians(Lat)))作为距离的客户的距离,您只需将两个表合并,并将数字计算在5以内:

select stores.name as Store,
    sum( ( 3959 * acos( cos( radians(stores.Lat) ) * cos( radians(customers.Lat) ) * cos( radians(stores.Lng) - radians(customers.Lng) ) + sin( radians(stores.Lat) ) * sin(radians(Lat)) ) ) <= 5 ) as Customers
from stores
cross join customers
group by stores.ID,stores.name
选择stores.name作为Store,

总和((3959*acos(cos(radians(stores.Lat))*cos(radians(customers.Lat))*cos(radians(stores.Lng)-radians(customers.Lng))+sin(radians(stores.Lat))*sin(radians(Lat)))看-虽然我真的不明白你在努力解决这其中的哪一部分。@我不知道如何查询所有的商店,而不是一次只查询一个。这不是很难,不是吗。现在用这个距离公式做一个函数!!
select stores.name as Store,
    count(customers.ID) as Customers
from stores
left join customers
    on ( 3959 * acos( cos( radians(stores.Lat) ) * cos( radians(customers.Lat) ) * cos( radians(stores.Lng) - radians(customers.Lng) ) + sin( radians(stores.Lat) ) * sin(radians(Lat)) ) ) <= 5
group by stores.ID,stores.name