【问题标题】:MySQL Exact syntax for this Query : Finding nearby Location此查询的 MySQL 确切语法:查找附近的位置
【发布时间】: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 子句中有效。

标签: php mysql google-maps geo


【解决方案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 方法),因此无法评论它的外观。
    猜你喜欢
    • 2017-09-07
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    相关资源
    最近更新 更多