查找用户附近的事件位置

时间:2014-12-11 18:08:12

标签: php mysql google-maps

我构建了一个移动应用程序,需要根据当前纬度和经度半径10英里来定位周围发生的事件。用户点击事件类型,API需要搜索距离他们10英里范围内的所有事件。我的数据库设置方式每个事件属于一个场所,也就是存储纬度和经度的地方。这是我到目前为止的SQL:

$sql = "SELECT events.*, (3959 * acos(cos(radians(78.3232)) * cos(radians($latitude)) * cos(radians($longitude) - radians(65.3234)) + sin(radians(78.3232)) * sin(radians($latitude)))) AS distance
    FROM events 
        INNER JOIN venues ON events.venue_id = venues.id 
        INNER JOIN promoters ON events.promoter_id = promoters.id 
    WHERE type = $type AND end > NOW()
    ORDER BY distance";

事件表存储有关事件(姓名,描述,开始,结束等)的信息,而场地表存储有关场地的信息(姓名,地址,纬度,经度等)。我如何加入这些表以确保根据用户的位置检索我想要的事件?

1 个答案:

答案 0 :(得分:0)

我编辑了查询以包含表前缀,这将允许数学从场地表中拉出lat和long列。我在我的数据库中检查了它,它也可以正常工作。 / p>

Bou在您的条件中不包含距离参数,使用HAVING可以在查询条件中包含distance列。您的查询可能会返回尚未发生的所有$ type事件。我用lat和long的用户表检查了这个,它工作得很好。

看起来你需要更像这样的东西(假设你实际上需要所有三个表中的所有列):

SELECT *, acos(cos(radians($userlat)) * cos(radians(`v`.`lat`)) * cos(radians(`v`.`long`) - radians($userlong)) + sin(radians($userlat)) * sin(radians(`v`.`lat`))) * 3959 AS `distance` 
    FROM `events` AS `e` 
        INNER JOIN `venues` AS `v` ON `e`.`venue_id` = `v`.`id`  
        INNER JOIN `promoters` AS `p` ON `e`.`promoter_id` = `p`.`id`  
    WHERE `e`.`type` = $type
    AND `e`.`end` > NOW() 
    HAVING `distance` < 25 
    ORDER BY `distance` ASC 
    LIMIT 20;