使用POST_META的地理邻近查询

时间:2015-10-26 作者:shadylane

我意识到这可能是一个效率低下的查询,但我正在尝试从连接到帖子的post\\u元表中获取纬度和经度值,以计算帖子与特定纬度和经度的接近程度。

精确定位为36.555555139.731111

我提出了以下问题,(基于帖子here) 但我调试它有困难。

SELECT ID, (
          6371 * acos (
              cos ( radians(36.555555 )
              * cos( radians( CAST(latitude.meta_value AS DECIMAL) ) )
              * cos( radians( CAST(longitude.meta_value AS DECIMAL)) - radians(139.731111) )
              + sin ( radians(36.555555 )                       
              * sin( radians( CAST(latitude.meta_value AS DECIMAL) ) )
             )
          ) AS distance
         FROM $wpdb->posts
         INNER JOIN $wpdb->postmeta latitude
             ON (ID = latitude.post_id AND latitude.meta_key = \'place_latitude\')
         INNER JOIN $wpdb->postmeta longitude
             ON (ID = longitude.post_id AND longitude.meta_key = \'place_longitude\')
         HAVING distance < 20
         ORDER BY distance
         LIMIT 0,6
我得到的错误是标准

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'FROM wp_posts INNER JOIN wp_postmeta latitude ON (ID = latitude.post_id\' at line 10
我不确定问题是在连接逻辑中还是在距离计算公式中。我之所以使用CAST,是因为我认为MySQL在字符串类型上运行数学函数可能会有问题。无论是否强制转换,错误都是相同的。

感谢您的指导!

1 个回复
最合适的回答,由SO网友:shadylane 整理而成

哦,天哪,这是非常明显的-有一个缺少的结束括号
这是工作查询。

SELECT ID, (
     6371 * acos (
     cos ( radians( 35.665833 ) )
     * cos( radians( latitude.meta_value ) )
     * cos( radians( longitude.meta_value ) - radians( 139.731111 ) )
     + sin ( radians(35.665833 ) )                       
     * sin( radians( latitude.meta_value ) )
    )
    ) AS distance
FROM $wpdb->posts
INNER JOIN $wpdb->postmeta latitude
    ON (ID = latitude.post_id AND latitude.meta_key = \'place_latitude\')
INNER JOIN $wpdb->postmeta longitude
    ON (ID = longitude.post_id AND longitude.meta_key = \'place_longitude\')
HAVING distance < 30
ORDER BY distance
LIMIT 0,6;

相关推荐

如何像使用wpdb一样使用MySQL?

根据标题,我需要使用LIKE操作符以编程方式使用$wpdb删除db上的一行。我想使用$wpdb->delete 消除发生的情况,但我不知道如何设置LIKE 操作员,因为在WHERE 它需要一个指定单个值或另一个数组的数组。我问你这个语法是否正确。$wpdb->delete(\'wp_posts\', array(\'post_type\' => \'flamingo_inbound\', \'post_content\' => \'%\'.$mail.\'%\'));提前感谢