2013-12-11 4 views
0

У меня есть база данных, которая содержит 2 таблицы:SQL-запрос, зависящий от двух таблиц?

  1. Компании.
  2. купоны

Каждая строка в Businesses имеют следующие поля:

{id, details, image, name, location_x, location_y},

, где location_x и location_y одно и то latitue и longitue координаты карт Google.

В Coupons таблице, каждая строка имеет следующие поля:

{id, business_id, image, details, goneDate, goneHour}.

id является купон id,

и business_id является id из business, что этот купон принадлежит.

Мой вопрос:

По quering Coupons, как я могу получить все купоны, которые их владелец радиус бизнеса расположение является менее 10km от заданной координаты?

или другими словами, это кто-то вроде этого:

, как взять все купоны бизнес-идентификатор, а затем перейти к бизнес-таблицы, и проверить, если радиус этого места ИНО находится менее чем в 10 км от данного места?

Я думаю, что это связано с inner join, не уверен.

Я работаю в hibernate framework на Java.

Пожалуйста, помогите мне, спасибо заранее!

+0

До тех пор, пока вы знаете формулу расчета расстояния, основанную на координатах карты, остальное - это тривиальная 'INNER JOIN'. –

+0

Какой двигатель базы данных вы используете? SQL Server, например, поддерживает встроенные пространственные координаты. – acfrancis

+0

@ PM77-1 Как использовать 'INNER JOIN'? – Billie

ответ

0

Я не думаю, что это можно сделать только в SQL, так как вам нужно будет сделать некоторые вычисления, чтобы выяснить расстояния между предприятиями и данным местом.

Что могло бы работать, чтобы запросить предприятия, рассчитать все убытки, выбросить более 10 км, а затем запросить купоны.

SELECT * FROM coupons WHERE business_id IN {array of your <10km business ids} 

Если вы просто хотите, чтобы получить результат с купонами, согласованных с предприятиями внутреннего присоединиться будет работать для вас

SELECT * FROM coupons INNER JOIN businesses ON coupons.business_id = businesses.id 
1

Это может быть выполнено с помощью математики!
Сначала мы знаем, что дано Point P(x, y),
P лежит в Circle с Center C(a,b) и Radius r

, если она удовлетворяет уравнению (x-a)^2 + (y - b)^2 <= r^2.

Таким образом, в вашем случае центр будет исходными координатами.

Чтобы получить все купоны для предприятий, которые лежат с заданным радиусом, этот запрос должен сделать трюк.

SELECT 
    bus.id, coup.id 
FROM 
    Businesses AS bus INNER JOIN 
    Coupons AS coup 
WHERE 
    bus.id = coup.business_id AND 
    (acos(sin(radians(business.location_y)) * sin(radians(a)) + cos(radians(business.location_y)) * cos(radians(a)) * cos(radians(business.location_x) - radians(b)) * 6371) <= 10; 

В приведенном выше запросе a is input_y и b is input_x и r is the radius = 10. Запрос принимает радиус Земли как 6371 КМ.

EDITED: после обсуждения с @acfrancis, я переписал запрос, используя уравнение, которое более подходит для вычисления расстояния между точками на Сфере. Это должно работать (хотя земля не идеальная сфера) для вашего случая использования. Все используемые функции являются postgres specific. Подробности можно посмотреть здесь http://en.wikipedia.org/wiki/Great-circle_distance.

+0

Не путайте широту/долготу с координатами X/Y на картезианской плоскости. Например, расстояние между двумя точками на одной и той же широте и на расстоянии 1 долготы зависит от широты. Рядом с полюсами расстояние очень мало, но на экваторе оно довольно велико. Правильный расчет не является тривиальным. Вот почему я рекомендую использовать встроенные функции, если это возможно. – acfrancis

+0

Да, вы абсолютно правы. Но в Usecase OP, описанном на расстояниях 10 км, погрешность с использованием этого уравнения пренебрежимо мала. Если для usecase требуется высокая точность, тогда да с запросом будет немного жестким :) – SpartanElite

+0

Это не вопрос точности. Ваша формула возвращает такое же расстояние, которое применяется к этим двум наборам точек, в (латах, длинных) градусах: [(0, 0); (0, 0,1)] и [(180, 0); (180, 0,1)]. Первый комплект находится на экваторе, а фактическое расстояние около 11 км. Вторая секунда находится на Северном полюсе, а расстояние равно нулю. – acfrancis

Смежные вопросы