2014-12-11 2 views
0

Я построил мобильное приложение, которое должно найти события, происходящие вокруг них, исходя из их текущей широты и долготы с радиусом 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

Я отредактировал запрос, чтобы включить префикс таблицы, который позволит математике вытащить лат и длинные столбцы из таблицы мест. Я проверил это против моей базы данных, и он отлично работает.

Буш не включает параметр расстояния по вашим критериям, используя HAVING позволяет включить столбец distance в ваши критерии запроса. Вероятно, ваш запрос возвратит все события типа $, которые еще не были выполнены. Я проверил это против пользовательской таблицы, которая у меня есть с 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; 
+0

Спасибо за быстрый ответ. Я вижу, что мне не хватало этого предложения HAVING. Я думаю, что моя трудность приходит, потому что координаты для каждого события хранятся в таблице мест. Мне нужно захватить информацию о событиях для всех мест, находящихся на этом расстоянии. Я продолжу играть с ним. Было бы лучше, если бы я разместил свои схемы БД? – WebDev84

+0

Схемы упрощали бы и, как ни печально, приводили бы нужные вам столбцы, которые вам действительно нужны. Я собираюсь отредактировать свой пост с другой мыслью об этом. – quid

+0

На самом деле я только что внесли изменения и увидел, как вы обращались к пользовательскому входу lat/lng и DB lat/lng, и ваше редактирование должно работать. Я собираюсь сделать некоторые тесты на этом, но он должен работать отлично. Спасибо огромное! – WebDev84