Php mysql-选择彼此距离近的记录

Php mysql-选择彼此距离近的记录,php,mysql,each,distance,Php,Mysql,Each,Distance,我有一个包含位置的mysql表,例如: ID latitude longitude value 1 11.11111 22.22222 1 2 33.33333 44.44444 2 3 11.11112 22.22223 5 我希望选择彼此相邻的记录(在上面的示例中,第1行和第3行),以便将它们作为一条记录插入新表中。比如说近,比如说100米。我希望新表为: ID latitude longitude value 1 11.11111 2

我有一个包含位置的mysql表,例如:

ID  latitude  longitude  value
1   11.11111  22.22222   1
2   33.33333  44.44444   2
3   11.11112  22.22223   5
我希望选择彼此相邻的记录(在上面的示例中,第1行和第3行),以便将它们作为一条记录插入新表中。比如说近,比如说100米。我希望新表为:

ID  latitude  longitude  value   
1   11.11111  22.22222   3
2   33.33333  44.44444   2
如您所见,我希望保留第一条记录的坐标,并在“value”列中插入两条记录的平均值

我使用的距离公式如下:

R*SQRT(((lon2*c-lon1*c)*cos(0.5*(lat2*c+lat1*c)))^2 + (lat2*c-lat1*c)^2)
在哪里

该公式适用于短距离

所以,我的问题不是lat,lon到距离的转换,而是SQL。我知道如何选择距离特定lat、lon坐标最大为100米的记录,但我不知道如何选择彼此之间距离最大的记录

我做这件事的一种方法是,用PHP一个接一个地循环记录,并对每个记录进行SQL查询,以选择附近的记录。但这样,我在循环中执行SQL查询,据我所知,这是一种糟糕的做法,特别是如果记录将达到数千条

我希望我是清楚的。如果没有,我很乐意给你更多的信息


感谢您的帮助。

以下是获取范围内所有位置的SQL:

SELECT 
    ID,
    latitude,
    longitude,
    (6371 * acos (cos( radians(origin.latitude)) * cos( radians( destination.latitude )) 
        * cos( radians(destination.longitude) - radians(origin.longitude)) + sin(radians(origin.latitude)) 
        * sin( radians(destination.latitude)))) AS distance
FROM myTable as destination, myTable as origin
WHERE destination.id = myId
HAVING distance < 100 --some value in kilometers
选择
身份证件
纬度,
经度,
(6371*acos(弧度(起点纬度))*cos(弧度(终点纬度))
*cos(弧度(目的地经度)-弧度(原点经度))+sin(弧度(原点经度))
*sin(弧度(目的地纬度))作为距离
从myTable作为目标,从myTable作为原点
其中destination.id=myId
距离小于100——以公里为单位的数值
6371是公里的常数。 3959是英里的常数


本主题有更多答案:

您能制作sql fieddel吗?
SELECT 
    ID,
    latitude,
    longitude,
    (6371 * acos (cos( radians(origin.latitude)) * cos( radians( destination.latitude )) 
        * cos( radians(destination.longitude) - radians(origin.longitude)) + sin(radians(origin.latitude)) 
        * sin( radians(destination.latitude)))) AS distance
FROM myTable as destination, myTable as origin
WHERE destination.id = myId
HAVING distance < 100 --some value in kilometers