php - php MySQL查询的精确语法: 正在查找附近位置

  显示原文与译文双语对照的内容

以下是查询在用户,lon和半径附近附近的产品的

我希望这里函数仅返回 Return的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



下面的查询正在运行。 但是ID确实返回了我不需要的ID和距离。 我只需要在半径内返回 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);



时间: 原作者:

@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



原作者:

所以我认为下面的工作应该是有效的,但是我现在不能测试它。 如果有问题,请指出,我将放弃答案。


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;



原作者:
...