Я нашел много похожих постов, но ничего похожего на мою проблему.
Я соединил две таблицы в своей базе данных при получении расстояния, используя широту и долготу.
В частности, это мои таблицы:
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?
Спасибо
Я могу опоздать, но похоже, что первый запрос делает именно то, что вы хотите. Просто удалите некоторые странные условия и получите всех пользователей, которые близки к указанной точке:
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)
Других решений пока нет …