【问题标题】:Find Event Locations Near User查找用户附近的活动地点
【发布时间】:2014-12-12 04:32:31
【问题描述】:

我构建了一个移动应用程序,该应用程序需要根据他们当前的纬度和经度以及 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";

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

【问题讨论】:

    标签: php mysql google-maps


    【解决方案1】:

    我编辑了查询以包含表前缀,这将允许数学从场地表中提取经纬度列。我对照我的数据库检查了它,它也可以正常工作。

    您的条件中没有包含距离参数,使用 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;
    

    【讨论】:

    • 感谢您的快速回答。我看到我错过了那个 HAVING 子句。我认为我的困难来了,因为每个事件的坐标都存储在场地表中。我需要获取该距离内所有场地的活动信息。我会继续玩它。如果我发布我的数据库模式会更好吗?
    • 模式会让事情变得更容易,但令人沮丧的是,列出您实际需要的列会有所帮助。我打算用另一个想法来编辑我的帖子。
    • 我实际上只是进行了更改,并看到您是如何引用用户输入 lat/lng 与 DB lat/lng 的,您的编辑应该可以工作。我将对此进行一些测试,但它应该可以完美运行。非常感谢!
    • 我现在实际上要更改我的网站以使用这种查询。所以谢谢你的想法!
    猜你喜欢
    • 1970-01-01
    • 2017-05-12
    • 2013-06-27
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多