Точный синтаксис MySQL для этого запроса: поиск ближайшего местоположения

ниже находится запрос на поиск товары поблизости от пользователя lat, lon и Radius ..

Я хочу, чтобы эта функция просто Вернуть ID магазина … Запрос, похоже, не работает, однако

SELECT
product_id

FROM
sm_products
WHERE
ROUND(
$earthRadius * ACOS(
SIN( $userlat*PI()/180 ) * SIN( geo_lat*PI()/180 )
+ COS( $userlat*PI()/180 ) * COS( geo_lat*PI()/180 )  *  COS( (geo_lon*PI()/180) - ($userlon*PI()/180) )   )
, 1) AS distance <= $userRadius
ORDER BY
distance ASC

Приведенный ниже запрос, который работает … но идентификатор возвращает идентификатор и расстояние, которое мне не нужно … Мне просто нужно вернуть product_id в радиусе

SELECT
ROUND(
$earthRadius * ACOS(
SIN( $userlat*PI()/180 ) * SIN( geo_lat*PI()/180 )
+ COS( $userlat*PI()/180 ) * COS( geo_lat*PI()/180 )  *  COS( (geo_lon*PI()/180) - ($userlon*PI()/180) )   )
, 1)
AS distance,
product_id

FROM
sm_products
HAVING
distance <= $userRadius
ORDER BY
distance ASC

Любая помощь?

РЕДАКТИРОВАТЬ (вызов функции)

$params['product_id'] = $this->productsInRadius($userlat, $userlon, $radius);

-1

Решение

@JonStirling Этот запрос работает … Но я не уверен, что это хорошая практика

SELECT
product_id
FROM
sm_products
WHERE
ROUND(
$earthRadius * ACOS(
SIN( $userlat*PI()/180 ) * SIN( geo_lat*PI()/180 )
+ COS( $userlat*PI()/180 ) * COS( geo_lat*PI()/180 )  *  COS( (geo_lon*PI()/180) - ($userlon*PI()/180) )   )
, 1) <= $userRadius
ORDER BY
ROUND(
$earthRadius * ACOS(
SIN( $userlat*PI()/180 ) * SIN( geo_lat*PI()/180 )
+ COS( $userlat*PI()/180 ) * COS( geo_lat*PI()/180 )  *  COS( (geo_lon*PI()/180) - ($userlon*PI()/180) )   )
, 1) ASC
0

Другие решения

Так что я считать следующее должно работать, но я в настоящее время не могу проверить это. Если это не так, пожалуйста, укажите это, и я скину ответ.

SELECT product_id
FROM (
SELECT
product_id,
ROUND(
$earthRadius * ACOS(SIN( $userlat*PI()/180 ) * SIN(geo_lat*PI()/180 ) + COS( $userlat*PI()/180 ) * COS( geo_lat*PI()/180     ) * COS( (geo_lon*PI()/180) - ($userlon*PI()/180))
, 1) AS distance
FROM
sm_products
WHERE
distance <= $userRadius
)
ORDER BY
distance ASC;
0

По вопросам рекламы [email protected]