我找到了很多类似的帖子,但没有一个可以与我的问题相提并论。
我在数据库中连接了两个表,同时使用纬度和经度检索距离。
具体来说,这些是我的表格:
registeredUsers:
publicSSID, nome, cognome, eta, sesso, foto, informazioni
(翻译:publicSSID = univoque id,nome = name,cognome = surname,eta = 年龄,sesso = 性别,foto = 照片,informazioni = 信息)
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
中的纬度和经度覆盖它。
我能做什么?有人知道使用这种 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 作为参数和条件(如 registerUsers.publicSSID <> $currentuserid)传递即可。
这里 http://sqlfiddle.com/#!2/33f96d/1/1 是查询的模型
(我必须硬编码$lat = 10,$lon = 10,以及两个不同的$dist - 1000 和 10000)