Поиск в базе данных MySQL значений, служащих входным широтам - PullRequest
0 голосов
/ 22 апреля 2020

Этот вопрос отличается от обычного mysql широта / длина, выборка данных на основе радиуса

Я хочу найти таблицу базы данных mysql, которая содержит следующие столбцы, например: *

ID  Items   lat       long      serving_radius(in km)

1   Item1  26.120888  85.364723    2
2   Item2  26.120888  85.364723    5
3   Item3  25.859800  85.786598    4
4   Item4  26.594900  85.504799    8

Теперь, если у пользователя есть широта / долгота (29.941095 / 77.812424), он хочет знать, какой из этих предметов может быть подан в его месте. Тогда как я получу результат, используя php & mysql.

Ответы [ 4 ]

1 голос
/ 22 апреля 2020

Я думаю, SQL, который вы ищете, это:

SELECT id, items, lat, long, serving_radius
FROM table 
WHERE lat = 29.941095 
AND long = 77.812424;

В вашем коде PHP вы должны использовать драйвер БД (я рекомендую вам PDO) для подключения к базы данных и выполните запрос.

Существует множество учебных пособий о том, как использовать PDO (создание соединения, выбор, вставка и т. д. c).

Я только что нашел этот учебник, который может помочь вам: https://parzibyte.me/blog/en/2019/10/14/php-mysql-tutorial-using-pdo/

Редактировать: Не уверен, если вы имеете в виду, как построить запрос с точными значениями lat и long или ближе к ним. Если это так, вы можете взглянуть на https://gis.stackexchange.com/questions/31628/find-points-within-a-distance-using-mysql

0 голосов
/ 01 мая 2020

Я думаю, что ваша проблема сложнее традиционной проблемы из-за переменной радиуса.

См. http://mysql.rjweb.org/doc.php/find_nearest_in_mysql для обсуждения.

В этом списке 5 способов msgstr "найти ближайший X". Самый простой, но самый медленный, это проверить каждый предмет на предмет его расстояния. Все остальное происходит быстрее благодаря использованию «ограничительной рамки» для ограничения количества проверяемых элементов. Однако кодирование становится сложным.

Ограничительная рамка, в вашем случае, может быть ограничена максимальным радиусом в таблице. Ваши выборочные данные показывают радиусы до 8, поэтому построение квадрата со стороной 2 * 8 вокруг начальной точки позволит вам использовать различные методы, которые я описываю.

Самое простое включает INDEX(lat, lng), INDEX(lng, lat), чтобы позволить оптимизатору выбрать что лучше. Преимущество состоит в том, что он проверяет только элементы шириной 16 (широта или долгота), а не весь земной шар. Недостаток в том, что он не слишком оптимизирует другое направление.

Я предлагаю вам использовать эту технику в качестве первого среза. Если вам нужно больше производительности, читайте дальше в моем документе и, оптимально, возвращайтесь за дополнительной помощью,

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

0 голосов
/ 22 апреля 2020

Хранится ли "serve_radius" в вашей таблице? Что вы можете сделать, это получить расстояние и проверить, находится ли оно под serve_radius

SELECT serving_radius, 
(6371 * acos(cos(radians(" . $userLatitude . ")) * cos(radians(`latitude`)) * cos(radians(`longitude`) - radians(" . $userLongitude . ")) + sin(radians(" . $userLatitude . ")) * sin(radians(`latitude`)))) as distance 
having distance < serving_radius
0 голосов
/ 22 апреля 2020

Этот вопрос похож на MySQL - Найти точки в радиусе от базы данных

  1. Найти радиус из ваших serving_radius и lat/lon в базе данных .
  2. используйте функцию MBRContains, чтобы найти многоугольник, содержащий точку пользователя.
    SELECT
        *
    FROM 
        items
    WHERE
        MBRContains(
            GeomFromText('Polygon((0 0,0 100,100 100,100 0,0 0))'),
            GeomFromText('Point(77.812424 29.941095)')) = 1;

надеюсь, что это поможет

...