Как повторно использовать переменную из оператора SQL SELECT в предложении WHERE - PullRequest
0 голосов
/ 04 августа 2020

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

SELECT
   *,
   @distance : = 6371 * 2 * asin(sqrt(POW(sin(({lat} - radians(address.latitude)) / 2), 2) + cos({lat}) * cos(radians(address.latitude)) * POW(sin(({lon} - radians(address.longitude)) / 2), 2))) 
FROM
   service,
   provider,
   address 
WHERE
   service.provider_id = provider.id 
   AND provider.address_id = address.id 
   AND provider.status = True 
   AND 
   (
      6371 * 2 * asin(sqrt(POW(sin(({lat} - radians(address.latitude)) / 2), 2) + cos({lat}) * cos(radians(address.latitude)) * POW(sin(({lon} - radians(address.longitude)) / 2), 2)))
   )
   < 10 
order by
   @distance

Мне нужно повторно использовать расстояние для такого условия, как , где @distance <10 </strong>, но я не могу повторно использовать, он возвращает пустой список. тогда как @ distance в ORDER BY работает нормально. Как я могу повторно использовать переменную в предложении where?

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Избегайте использования переменных MySQL; они устарели в более новых версиях MySQL. Кроме того, лучше использовать соединение с современным синтаксисом (SQL -92) вместо старых соединений.

В любом случае, я думаю, что следующий запрос дает то, что вы хотите:

select *
from (
  SELECT
    *,
    6371 * 2 * asin(sqrt(POW(sin(({lat} - radians(a.latitude)) / 2), 2) 
      + cos({lat}) * cos(radians(a.latitude)) * POW(sin(({lon} 
      - radians(a.longitude)) / 2), 2))) as distance
  FROM service s
  JOIN provider p ON s.provider_id = p.id
  JOIN address a ON p.address_id = a.id
  WHERE p.status = True 
) x
WHERE distance < 10
ORDER BY distance
0 голосов
/ 04 августа 2020
• 1000 вместо WHERE для ссылки на псевдоним.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...