псевдоним подзапроса и где - PullRequest
0 голосов
/ 03 августа 2020

Следующее:

select 
    `restaurants`.*, 
    ST_Distance_Sphere(point(longitude, latitude), point(12.345600, -12.345600)) as distance 
from `restaurants` 
where `distance` <= `delivery_max_range`

вернет Unknown column 'distance' in 'where clause'.

Небольшой поиск показал решение как:

select 
    `restaurants`.*, 
from `restaurants` 
where 
    ST_Distance_Sphere(point(longitude, latitude`), point(12.345600, -12.345600)) <= `delivery_max_range` 

Что действительно работает, но мне нужен этот вычисленный псевдоним столбца distance, так как я хочу напечатать его конечному пользователю.

Я придумал следующее:

select 
    `restaurants`.*, 
    (ST_Distance_Sphere(point(longitude, latitude), point(12.345600, -12.345600))) as `distance` 
from `restaurants` 
where 
    ST_Distance_Sphere(point(longitude, latitude`), point(12.345600, -12.345600)) <= `delivery_max_range` 

который выглядит так же уродливо, как и он наверное есть. Есть ли лучший способ сделать это? Меня беспокоит двойное вычисление расстояния от двигателя mysql. Существуют тысячи ресторанов.

Пример использования: я хочу отфильтровать рестораны, которые могут (delivery_max_range) доставлять товары в мой дом (lng = 12.345600, lat = -12.345600). Я хочу показать distance каждому ресторану, отвечающему этим критериям.

1 Ответ

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

MySQL расширяет использование предложения HAVING, поэтому его можно использовать в неагрегированных запросах. Это работает в этом случае:

select r.*, 
       ST_Distance_Sphere(point(longitude, latitude), point(12.345600, -12.345600)) as distance 
from restaurants r
having`distance <= delivery_max_range;

Примечание: нет необходимости везде использовать обратные кавычки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...