2017-08-11 67 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

沒有修改的查詢也返回相同的結果。我改變了經緯度,但結果相同。 –

相關問題