Соединить две таблицы подзапроса

0

Я пытаюсь получить * из таблицы 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

Изображение 174551

Таким образом, в основном пользователи 89, 90 и 91 попадают под радиус местоположения, но не будут включены в результат, потому что пользователь 88 уже им понравился.

Теги:

2 ответа

0
Лучший ответ

Попробуй это...

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, так как он должен быть отфильтрован.

  • 0
    замечательно! Кажется, работает хорошо. Можно ли на него добавить несколько предложений WHERE от users2? как ГДЕ users2.age> 25
  • 1
    Да. Просто добавьте их до или после условия и используйте И или ИЛИ при необходимости.
Показать ещё 4 комментария
0

Вы можете попробовать следующее:

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;
  • 0
    Спасибо за ответ. У меня были смешанные результаты с этим. Запрос вернул несколько неправильных строк из радиуса местоположения.
  • 0
    Будет полезно, если вы покажете правильный и неправильный результат, и вы можете поставить больше условий для получения правильного результата.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню