получить запись из базы данных, используя широту долготы расстояние MySQL соединение

Я нашел много похожих постов, но ничего похожего на мою проблему.

Я соединил две таблицы в своей базе данных при получении расстояния, используя широту и долготу.

В частности, это мои таблицы:

registeredUsers:
publicSSID, nome, cognome, eta, sesso, foto, informazioni

(перевод: publicSSID = уникальный идентификатор, имя = имя, фамилия, фамилия, эта = возраст, sesso = пол, фото = фотографии, informazioni = информация)

position:
ssid, latitude, longitude

(ssid = publicSSID -> то же самое)

это мой запрос:

SELECT publicSSID, nome, cognome, eta, sesso, foto, position.latitude,
position.longitude, informazioni, (3956 * 2 *
ASIN(SQRT( POWER(SIN(($lat - abs(latitude))*pi()/180/2),2)
+COS($lat*pi()/180 )*COS(abs(latitude)*pi()/180)
*POWER(SIN(($lon-longitude)*pi()/180/2),2))))
as distance
FROM registeredUsers, position
WHERE registeredUsers.publicSSID = position.ssid
and longitude between ($lon - 1/abs(cos(radians($lat))*69))
and ($lon + 1/abs(cos(radians($lat))*69))
and latitude between ($lat -(1/69))
and ($lat +(1/69))
having distance < $dist ORDER BY distance limit 200;

где $lat, $lon, $dist соответственно мои входная широта, долгота и расстояние в км, которые я использую для получения записей. Так, например, если есть две записи с широтой и долготой, которые, как мы знаем, находятся в пределах 10 километров от расстояния, если я установлю $dist = 10база данных должна вернуть мне эти две записи.

Сейчас проблем много.

Прежде всего, говоря, что $lat, $lon также хранятся в таблице position (потому что тот, кто пытается сделать этот запрос, является пользователем, который хочет найти другого пользователя рядом с собой) и я не хочу, чтобы он извлекал себя (смеется), но в данный момент с помощью этого запроса я извлекаю ТОЛЬКО свою запись (поэтому сам я получаю широту и долготу, равные $lat, $lon).

Я попытался отредактировать это, и я удалил эту строку:

WHERE registeredUsers.publicSSID = position.ssid

Итак, запрос сейчас такой:

SELECT publicSSID, nome, cognome, eta, sesso, foto, position.latitude,
position.longitude, informazioni, (3956 * 2 *
ASIN(SQRT( POWER(SIN(($lat - abs(latitude))*pi()/180/2),2)
+COS($lat*pi()/180 )*COS(abs(latitude)*pi()/180)
*POWER(SIN(($lon-longitude)*pi()/180/2),2))))
as distance
FROM registeredUsers, position
WHERE longitude between ($lon - 1/abs(cos(radians($lat))*69))
and ($lon + 1/abs(cos(radians($lat))*69))
and latitude between ($lat -(1/69))
and ($lat +(1/69))
having distance < $dist ORDER BY distance limit 200;

И теперь НОВАЯ проблема в том, что он извлекает всех людей вокруг меня (включая меня), но он меняет каждую широту и долготу (в результате не в базе данных), перезаписывая ее широтой и долготой в $lat,$lon,

Что я могу сделать? Кто-нибудь знает способ получить то, что я хочу, используя этот вид Присоединиться для MySQL?

Спасибо

2

Решение

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

SELECT publicSSID, nome, cognome, eta, sesso, foto, position.latitude,
position.longitude, informazioni, (3956 * 2 *
ASIN(SQRT( POWER(SIN(($lat - abs(latitude))*pi()/180/2),2)
+COS($lat*pi()/180 )*COS(abs(latitude)*pi()/180)
*POWER(SIN(($lon-longitude)*pi()/180/2),2))))
as distance
FROM registeredUsers, position
WHERE registeredUsers.publicSSID = position.ssid
having distance < $dist ORDER BY distance limit 200;

Если вы хотите исключить пользователя, который выполняет запрос, просто передайте его идентификатор в качестве параметра и условие, как зарегистрированный пользователь.publicSSID <> $ currentuserid.

Вот http://sqlfiddle.com/#!2/33f96d/1/1 это модель вашего запроса

(Мне пришлось жестко кодировать $ lat = 10, $ lon = 10 и два разных $ dist — 1000 и 10000)

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector