使用纬度经度距离 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 进行硬编码)
我发现了很多类似的帖子,但没有一个能与我的问题相提并论。
我在数据库中连接了两个 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 进行硬编码)