2017-08-11 69 views
0

我在本地服务器上有一个MySQL表。该表格包含用户标记的地点的纬度和经度。我试图让所有身份标识的人在距离提供的经度和纬度1公里内标记他们的位置。但我的结果并不是预期的。如何从提供的纬度和长度从MySql获取半径范围内的所有结果查询

表: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公里内,因为您的查询看起来很完美 –

+0

请考虑做一个行计数,以便知道是否有任何结果。 – Script47

+0

@JayminNoob不可能,所有记录都不在1公里以内。 –

回答

1

您的查询包含一些带引号的字符串,例如'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表中获得数千行时,该查询将比交通堵塞中的纽约公交慢。您应该使用边界框进行调查以加快速度。 Read this

+0

非常感谢,它的工作原理。我正在使用行情数据库列。 –

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'; 

让我知道是否有任何查询发生。

+0

没有修改的查询也返回相同的结果。我改变了经纬度,但结果相同。 –

相关问题