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

retrieve record from database using latitude longitude distance mysql join

我发现了很多类似的帖子,但没有一个能与我的问题相提并论。

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

具体来说,这些是我的 tables:

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 分别是我输入的纬度、经度和我用来检索记录的以公里为单位的距离。因此,例如,如果我们知道在 10 公里的距离内有两条经纬度记录,如果我设置 $dist = 10,数据库必须 return 我这两条记录。

现在问题多了

首先说一下$lat, $lon也存储在tableposition(因为谁想这样做request 是一个想要找到他自己附近的另一个用户的用户) 我不希望它检索我自己(大笑),但目前通过该查询我只检索我的记录(所以我自己,我检索的纬度和经度等于$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;

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

我能做什么?有人知道使用这种 Join for mySQL 来检索我想要的东西的方法吗?

谢谢

我可能来晚了,但看起来第一个查询完全符合您的要求。去掉一些奇怪的条件,得到所有接近指定点的用户:

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 <> $currentuserid.

这里http://sqlfiddle.com/#!2/33f96d/1/1是你查询的模型

(我不得不对 $lat = 10、$lon = 10 和两个不同的 $dist - 1000 和 10000 进行硬编码)