使用纬度经度距离mysql join从数据库中检索记录

时间:2015-01-15 11:03:50

标签: php mysql sql join distance

我发现了很多类似的帖子,但没有什么能比得上我的问题。

我在数据库中连接了两个表,同时使用纬度和经度检索距离。

具体来说,这些是我的表格:

registeredUsers:
publicSSID, nome, cognome, eta, sesso, foto, informazioni

(翻译:publicSSID = univoque id,nome = name,cognome = surname,eta = age,sesso = sex,foto = photos,informazioni = informations)

position:
ssid, latitude, longitude

(ssid = publicSSID - >同样的事情)

这是我的疑问:

SELECT publicSSID, nome, cognome, eta, sesso, foto, position.latitude, 
    position.longitude, informazioni, (3956 * 2 * 
      ASIN(SQRT( POWER(SIN(($lat - abs(latitude))*pi()/180/2),2)
      +COS($lat*pi()/180 )*COS(abs(latitude)*pi()/180)
      *POWER(SIN(($lon-longitude)*pi()/180/2),2)))) 
      as distance 
      FROM registeredUsers, position 
      WHERE registeredUsers.publicSSID = position.ssid
      and longitude between ($lon - 1/abs(cos(radians($lat))*69)) 
      and ($lon + 1/abs(cos(radians($lat))*69)) 
      and latitude between ($lat -(1/69)) 
      and ($lat +(1/69)) 
      having distance < $dist ORDER BY distance limit 200;

其中$lat$lon$dist分别是我输入的纬度,经度和用于检索记录的距离(以km为单位)。因此,例如,如果我们知道有两个纬度和经度记录距离不到10公里,如果我设置$dist = 10,数据库必须返回这两个记录。

现在问题很多。

首先,说$lat, $lon也存储在表position 中(因为试图执行此请求的用户是想要查找其他用户的用户靠近自己) 我不希望它自己检索(笑),但是在那个查询的那一刻我只检索我的记录(所以我自己,我检索纬度和经度等于$lat, $lon)。

我尝试编辑它并删除了这一行:

WHERE registeredUsers.publicSSID = position.ssid

所以现在的查询是:

SELECT publicSSID, nome, cognome, eta, sesso, foto, position.latitude, 
    position.longitude, informazioni, (3956 * 2 * 
      ASIN(SQRT( POWER(SIN(($lat - abs(latitude))*pi()/180/2),2)
      +COS($lat*pi()/180 )*COS(abs(latitude)*pi()/180)
      *POWER(SIN(($lon-longitude)*pi()/180/2),2)))) 
      as distance 
      FROM registeredUsers, position 
      WHERE longitude between ($lon - 1/abs(cos(radians($lat))*69)) 
      and ($lon + 1/abs(cos(radians($lat))*69)) 
      and latitude between ($lat -(1/69)) 
      and ($lat +(1/69)) 
      having distance < $dist ORDER BY distance limit 200;

现在新问题是它检索了我周围的所有人(包括我自己),但它改变了每个纬度和经度(结果不在数据库中)用$lat,$lon中的纬度和经度覆盖它

我该怎么办?有人知道使用这种加入为mySQL检索我想要的东西吗?

谢谢

1 个答案:

答案 0 :(得分:2)

我可能会迟到,但看起来第一个查询确实是你想要的。只需删除一些奇怪的条件,并获取所有接近指定点的用户:

SELECT publicSSID, nome, cognome, eta, sesso, foto, position.latitude, 
    position.longitude, informazioni, (3956 * 2 * 
      ASIN(SQRT( POWER(SIN(($lat - abs(latitude))*pi()/180/2),2)
      +COS($lat*pi()/180 )*COS(abs(latitude)*pi()/180)
      *POWER(SIN(($lon-longitude)*pi()/180/2),2)))) 
      as distance 
      FROM registeredUsers, position 
      WHERE registeredUsers.publicSSID = position.ssid
      having distance < $dist ORDER BY distance limit 200;

如果要排除用户,执行查询的用户只需将其id作为参数传递,并将条件传递给registeredUsers.publicSSID&lt;&gt; $ currentuserid。

此处http://sqlfiddle.com/#!2/33f96d/1/1是您查询的模型

(我必须硬编码$ lat = 10,$ lon = 10,以及两个不同的$ dist - 1000和10000)