2016-05-24 6 views
2

Ниже мой company стол с его postalcode, lat, lon и radius в километрах, где каждая компания способна предоставить свои услуги.Выбор записей на основе ZipCode, это радиус, широта и долгота в MySQL

id company_name city     postalcode radiu latitude  longitude 
1 A    Drogteropslagen  7705 PA  10  52.61666700 6.50000000 
2 B    Coevorden   7740 AA  15  52.66666700 6.75000000 
3 C    Emmen    7812 TN  5  52.78333300 6.9000000 
4 D    Emmer-Compascuum  7881 PZ  25  52.81666700 7.05000000 
5 E    Nieuw-Dordrecht  7885 AA  60  52.75000000 6.96666700 

Я хотел бы выбрать компании, которые имеют конкретный почтовый индекс, например. 7813 AB живет в пределах своих postalcode + radius, даже этот почтовый индекс 7813 AB не является таким же, как и у компании. как написать запрос sql, чтобы выбрать эти компании?

+1

Каков ваш ожидаемый выход этого образца данных? – sagi

+2

@sagi Он уже задал этот вопрос [здесь] (http://stackoverflow.com/questions/37404372/select-records-by-zipcode-and-its-radius-in-mysql/37404516?noredirect=1#comment62325499_37404516) , но даже не дал мне новую ссылку. –

+0

@sagi Я ожидаю получить хотя бы рекорд id = 3 и 5, потому что почтовый индекс 7813 AB находится рядом с 7812 TN, а для записи id = 5, потому что его радиус составляет 60 км., Довольно длинный, поэтому почтовый индекс 7813 AB должен жить в этой области. Это просто идея. Наконец, он основан на вычислении лат и lon плюс радиус этих компаний. –

ответ

2
SELECT t1.company_name, t2.company_name, 
    (6371 * acos(cos(radians(t1.lat1)) * cos(radians(t2.lat2)) 
    * cos(radians(t2.lng2) - radians(t1.lng1)) + sin(radians(t1.lat1)) * sin(radians(t2.lat2)))) AS distance, 
    t1.radius 
FROM 
(
    SELECT company_name, latitude AS lat1, longitude AS lng1, 
     radius 
    FROM company 
    WHERE postalcode = '7813 AB' 
) t1 
CROSS JOIN 
(
    SELECT company_name, latitude AS lat2, longitude AS lng2 
    FROM company 
) t2 
HAVING distance < t1.radius AND t1.company_name != t2.company_name 
+0

спасибо за попытку помочь мне. Я пытаюсь выяснить, где поставить конкретный postcalcode как условие, например. где postalcode = "7813 AB"; потому что этот почтовый индекс будет поступать от ввода конечного пользователя. –

+0

Заменить 'WHERE c.company_name = 'A'' с' WHERE postalcode =' 7813 AB'' в первом подзапросе. –

+0

У меня есть следующая ошибка sql: # 1054 - Неизвестный столбец 'distance' в 'where clause'. Похоже, что расстояние с псевдонимом не работает. –

0

Вы можете использовать пространственные типы данных для longitude и latitude (или преобразовать их), а затем вычислить разность с st_difference см https://dev.mysql.com/doc/refman/5.7/en/spatial-operator-functions.html#function_st-difference

Пример:

SELECT st_distance(POINT(50.0, 8.0), POINT(latitude, longitude)) FROM company; 

Расстояние, однако, приближение и лучше всего подходит для небольших расстояний. При больших расстояниях ошибка вычисления увеличивается из-за того, что MySQL только вычисляет плоские координаты (евклидова геометрия).

+0

Можете ли вы показать мне образец запроса, основанный на моей таблице базы данных выше? –

+0

Я добавил несколько примеров кода. –

0

Вам нужно будет преобразовать входной почтовый индекс в координаты long/lat.

Существует два способа сделать это; наиболее эффективным способом является импорт таблицы с почтовым кодом и длинными/полными координатами. Вы можете найти dataset здесь для Нидерландов.

Альтернативой является использование API геокодирования; есть несколько доступных; Google - ваш друг. Это может быть проблемой производительности (если у вас есть тысячи клиентов, одновременно отправляющих почтовые коды) и может потребовать лицензирования у поставщика API.

Как только у вас есть длинный/лат для ввода почтового кода, вы можете использовать геопространственную логику в MySQL для вычисления того, что находится в радиусе.

+0

Как использовать геопространственную логику в MySQL? –

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

  • Нет связанных вопросов^_^