代码之家  ›  专栏  ›  技术社区  ›  Manish Negi

如何从MySql查询中获得所提供的lat和long中radius内的所有结果

  •  4
  • Manish Negi  · 技术社区  · 8 年前

    我在本地服务器上有一个MySQL表。该表包括用户标记的位置的纬度和经度。我正在尝试获取所有在距离提供的经纬度1公里内标记其位置的id。但我的结果出乎意料。

    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
    )
    

    查询返回表中的所有记录。谁能告诉我问题出在哪里?

    2 回复  |  直到 8 年前
        1
  •  3
  •   O. Jones    8 年前

    您的查询包含一些带引号的字符串,如“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

        2
  •  0
  •   Jaymin    8 年前

    是的,有可能所有记录都在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 lng来进一步检查,

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

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