我发现了很多类似的帖子,但没有可比的问题。
在使用纬度和经度检索距离的同时,我已经连接了数据库中的两个表。
具体来说,这些是我的表格:
registeredUsers:
publicSSID, nome, cognome, eta, sesso, foto, informazioni
(翻译:publicSSID =唯一ID,名称=名称,姓=姓,年龄=年龄,性别=性别,照片=照片,信息=信息)
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的这种Join来检索我想要的内容的方法吗?
谢谢
我可能迟到了,但是看起来第一个查询确实可以满足您的要求。只需删除一些奇怪的条件并获得接近指定点的所有用户:
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进行硬编码)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句