此查询的 MySQL 确切语法:查找附近的位置
Posted
技术标签:
【中文标题】此查询的 MySQL 确切语法:查找附近的位置【英文标题】:MySQL Exact syntax for this Query : Finding nearby Location 【发布时间】:2016-03-03 23:56:54 【问题描述】:下面是从用户的纬度、经度和半径查找产品附近的查询..
我希望这个函数只是返回商店的 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);
【问题讨论】:
为什么查询返回两者都重要?处理数据时只需忽略该字段 @RamRaider :我已将函数调用添加到 Question.. 我怎样才能只检索选定的字段.. 查询无效?发生什么了?一个错误?一个空的结果集? @JonStirling : 它返回一个错误'检查与您的 mysql 服务器版本相对应的手册,以获得在 AS 附近使用的正确语法' @SharanMohandas 那么问题可能是AS distance
我不认为在WHERE
子句中有效。
【参考方案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
【讨论】:
【参考方案2】:所以我认为以下应该可以工作,但我目前无法对其进行测试。如有错误,请指出,我将放弃答案。
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;
【讨论】:
正如我在问题中所说...这个查询有效,但它确实返回 id 和 distance.. @SharanMohandas 上面的查询只会返回product_id
(如果可以的话)。
虽然,您可以很容易地摆脱超级选择,返回 product_id 和距离(如在您的第二个示例中并仅在 php 中过滤到 product_id,但您没有不提供任何 PHP(特别是 productsInRadius
方法),因此无法评论它的外观。以上是关于此查询的 MySQL 确切语法:查找附近的位置的主要内容,如果未能解决你的问题,请参考以下文章