如何从MySql查询中获取所有半径范围内提供的纬度和经度的结果

5

我有一个MySQL表格在我的本地服务器上。这个表格包含用户标记的地方的纬度和经度。我正在尝试获取所有那些距离提供的纬度和经度1公里以内的地方的ID。但是我的结果并不如预期。

表格名称:map_locations

id  user_id lat     lng     place_name
1   1   28.584688   77.31593    Sec 2, Noida
2   2   28.596026   77.314494   Sec 7, Noida
3   5   28.579876   77.356131   Sec 35, Noida
4   1   28.516831   77.487405   Surajpur, Greater Noida
5   1   28.631451   77.216667   Connaught Place, New Delhi
6   2   19.098003   72.83407    Juhu Airport, Mumbai

以下是 PHP 脚本:

$lat = '28.596026';
$long = '77.314494';
$query = "SELECT  id,
                  (6371 * acos( cos( radians($lat) ) * cos( radians('lat') ) *
                        cos( radians('lng') - radians($long)) +
                        sin(radians($lat)) * sin(radians('lat')) )
                  ) as distance
    FROM  map_locations
    HAVING  'distance' < 1
    ORDER BY  id
    LIMIT  25";

$_res = mysqli_query($conn, $query) or die('Error query:  '.$query);
$detail = array();
$i=0;
while($row = $_res->fetch_assoc()) {
    $detail[$i] = $row['id'];
    $i++;
}
print_r($detail);

结果:

Array
(
   [0] => 1
   [1] => 2
   [2] => 3
   [3] => 4
   [4] => 5
   [5] => 6
)

查询返回表中的所有记录。请问有人能告诉我这个查询有什么问题吗?


1
你的查询看起来很完美,但是所有记录都在同一位置或1公里范围内是否可能呢? - Jaymin
考虑进行行计数,以便了解是否有任何结果。 - Script47
@JayminNoob 不可能,所有记录都不在1公里范围内。 - Manish Negi
2个回答

4

您的查询包含了一些带引号的字符串,例如'lat'、'long'和'distance',它们应该是列名lat、long和distance。

特别地,它以

结束。

 HAVING 'distance' < 0.5

这一点始终是正确的,因为MySQL在将字符串用于数字上下文时总是将它们强制转换为数字。对MySQL来说,它看起来像HAVING 0 < 0.5。您需要

 HAVING distance < 0.5 

请尝试这个查询。 (http://sqlfiddle.com/#!9/4f5116/5/2)

SELECT id, 
       (6371 * acos( cos( radians($lat) ) * cos( radians(lat) ) * 
        cos( radians(lng) - radians($long)) + sin(radians($lat)) *
        sin(radians(lat)) )) as distance 
  FROM map_locations
HAVING distance < 0.5

还有,要注意!当你的map_locations表中有数千行时,这个查询将比纽约交通堵塞中的公交车还要慢。你应该考虑使用边界框来加速它。阅读此文


非常感谢,它起作用了。我在数据库列中使用了引号。 - Manish Negi

0

是可能所有记录都在1公里范围内,我建议您尝试更改距离。

让我为您重新修订查询,然后检查是否给出了完美的结果。

$query = "SELECT id,(6371 * acos( cos( radians($lat) ) * cos( radians('lat') ) * cos( radians('lng') - radians($long)) + sin(radians($lat)) * sin(radians('lat')) )) as distance FROM map_locations HAVING 'distance' < 0.5 ORDER BY id LIMIT 25";

你也可以通过更改手动提供的经纬度来进一步检查它,

$lat = '21.591026';
$long = '79.314994';

如果有任何疑问,请告诉我。


没有修改查询,结果仍然相同。我改变了纬度和经度,但结果仍然相同。 - Manish Negi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接