Я пытаюсь получить *
из таблицы users2
где местоположение пользователя находится в пределах заданного радиуса.
Запрос местоположения отлично работает в таблице user_location2
.
SELECT uid, ( 3959 * acos( cos( radians(28.247800068217) ) * cos( radians( 'lat' ) ) * cos( radians( 'lon' ) - radians(-80.726205977101) )
+ sin( radians(28.247800068217) ) * sin( radians( 'lat' ) ) ) )
AS distance FROM user_location2
HAVING distance <= 25 ORDER BY time_stamp
и внутреннее соединение работает нормально без подзапроса местоположения
SELECT *
FROM users2
LEFT JOIN user_location2
ON user_location2.uid = users2.id
У меня просто проблемы с этим. Вот мой текущий запрос, который просто возвращает все строки, поэтому я, очевидно, что-то делаю неправильно.
SELECT *
FROM users2
LEFT JOIN user_location2
ON user_location2.uid = users2.id
WHERE EXISTS (SELECT NULL, ( 3959 * acos( cos( radians(26.247800068217) ) * cos( radians( 'lat' ) ) * cos( radians( 'lon' ) - radians(-89.726205977101) ) + sin( radians(26.247800068217) ) * sin( radians( 'lat' ) ) ) )
AS distance FROM user_location2
HAVING distance <= 5 ORDER BY time_stamp)
Включено редактирование
Я надеюсь добавить в 3-ей таблице (user_like), чтобы устранить множество возможных строк, которые не должны включаться в результат.
Скажем, скрипт работает для user_id = 88
Таким образом, в основном пользователи 89, 90 и 91 попадают под радиус местоположения, но не будут включены в результат, потому что пользователь 88 уже им понравился.
Попробуй это...
SELECT users2.*
FROM users2
LEFT JOIN user_location2
ON user_location2.uid = users2.id
WHERE ( 3959 * acos( cos( radians(28.247800068217) ) * cos( radians( 'lat' ) ) * cos( radians( 'lon' ) - radians(-80.726205977101) )
+ sin( radians(28.247800068217) ) * sin( radians( 'lat' ) ) ) ) < = 5
ORDER BY time_stamp
Соединение между двумя таблицами отлично. Вычисленный столбец был добавлен в предложение select и предложение where, потому что фильтр требует его там. Было бы проще сделать это через представление, чтобы, если вам нужно его изменить, это можно сделать в одном месте.
EDIT: Удалено вычисление из SELECT, потому что я считаю, что вам не нужно это видеть. Просто оставил его в предложении WHERE, так как он должен быть отфильтрован.
Вы можете попробовать следующее:
SELECT *
FROM users2 A
LEFT JOIN user_location2 B
ON B.uid = A.id
WHERE ( 3959 * acos( cos( radians(26.247800068217) ) * cos( radians( 'B.lat' ) ) * cos( radians( 'B.lon' ) - radians(-89.726205977101) ) + sin( radians(26.247800068217) ) * sin( radians( 'B.lat' ) ) ) ) > 25;