此查询的 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 确切语法:查找附近的位置的主要内容,如果未能解决你的问题,请参考以下文章

在特定角度的位置附近查找 - 在圆形查询中只考虑前面的半圈而不是后面

需要帮助查找 SQL 代码中的语法错误 [关闭]

如何使用我的位置自动查找附近的位置?

地理位置示例代码查找我附近的特定商店 HTML 5

MongoDB的地理位置索引

vertx+redis实现查找附近的人