使用纬度经度距离mysql连接从数据库中检索记录
Posted
技术标签:
【中文标题】使用纬度经度距离mysql连接从数据库中检索记录【英文标题】:retrieve record from database using latitude longitude distance mysql join 【发布时间】:2015-01-15 11:03:50 【问题描述】:我发现了很多类似的帖子,但没有一个能与我的问题相提并论。
我在使用纬度和经度检索距离时连接了数据库中的两个表。
具体来说,这些是我的表格:
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
,数据库必须返回这两条记录。
现在问题很多。
首先,说$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
中的纬度和经度覆盖它。
我能做什么?有人知道使用这种 Join for mysql 检索我想要的内容的方法吗?
谢谢
【问题讨论】:
2 个问题: 1. 如果您计算距离并确保只得到落在所需距离内的结果,为什么还要在 where 子句中限制纬度和经度? 2.(相关)你用的69常量是什么意思? 【参考方案1】:我可能会迟到,但看起来第一个查询完全符合您的要求。只需去掉一些奇怪的条件,获取所有靠近指定点的用户即可:
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)
【讨论】:
以上是关于使用纬度经度距离mysql连接从数据库中检索记录的主要内容,如果未能解决你的问题,请参考以下文章