我构建了一个移动应用程序,需要根据当前纬度和经度半径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";
事件表存储有关事件(姓名,描述,开始,结束等)的信息,而场地表存储有关场地的信息(姓名,地址,纬度,经度等)。我如何加入这些表以确保根据用户的位置检索我想要的事件?
答案 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;