在SQL中远距离搜索

时间:2016-04-18 18:48:42

标签: mysql coordinates

我的数据库包含一个联系人列表,其中包含puesdo坐标。这是一个示例:

moment.utc("160114224512Z", 'x').format('YYYY-MM-DD HH:mm:ss');
"1975-01-28 04:10:24"

我想知道是否可以创建一个可以在两个坐标的距离内搜索的查询?例如,我想要一份居住在詹姆斯20平方英里范围内的人员名单。

哪些功能可以帮助我做到这一点?

3 个答案:

答案 0 :(得分:2)

Mysql语法:

SELECT name FROM `table` WHERE SQRT(
POW(e_point - (SELECT e_point FROM `table` WHERE name='james'), 2) + 
POW(n_point - (SELECT n_point FROM `table` WHERE name='james'), 2)) < 20
AND name <> 'james'

注意:

  1. 您需要在3个地方更改“名称”。
  2. 添加了
  3. 子查询,让您只使用一个变量(名称)运行一个查询。如果删除子查询,则需要运行2个查询(第一个查询检索coord,第二个查询搜索人员附近)
  4. 等式是:
  5. enter image description here

    其中p1 =(p1x,p1y)和p2 =(p2x,p2y)

答案 1 :(得分:2)

要计算你需要获得Great-circle distance的2个坐标之间的距离,因为地球是圆的,距离的测量会受到这个事实的影响。

enter image description here

根据Google Maps API docs

,使用SQL执行此操作会是这样的
SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) 
AS distance 
FROM markers 
HAVING distance < 25 
ORDER BY distance
LIMIT 0 , 20;

答案 2 :(得分:1)

如果你的坐标代表x和y坐标,你可以使用这样的东西(只用实际的表名替换contacts的出现次数)返回的距离是&#39; James&#39;的距离:< / p>

SELECT T2.name,
       SQRT(POWER(T2.e_point-T1.e_point,2)+
            POWER(T2.n_point-T1.n_point,2)) as distance
FROM contacts T1
INNER JOIN contacts T2 ON
  SQRT(POWER(T2.e_point-T1.e_point,2)+
       POWER(T2.n_point-T1.n_point,2)) <= 20
WHERE T1.name = 'James'
AND T1.name != T2.name

sqlfiddle