如何在MySQL中加入查询以根据距离计算和Google地理编码查找WordPress帖子?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在MySQL中加入查询以根据距离计算和Google地理编码查找WordPress帖子?相关的知识,希望对你有一定的参考价值。
我正在尝试使用WordPress表结构准备一个基于用户当前位置查找位置的查询。
我正在使用WordPress开发此应用程序。
我创建了一个名为store的自定义帖子类型。当从管理员添加商店时,我能够使用地理编码找到它的lat/lng
值,并将它们存储在wp_postmeta
表中,对齐两个元键store_lat
和store_lng
,同时基本信息存储在wp_posts
表中。
我希望通过使用两点之间的距离过滤wp_postmeta表中的记录来从wp_posts表中获取商店,其中一个点是用户的当前位置。
我为wp_postmeta表中的每个post_id在一行中构建了以下查询获取lat / lng值,这很好:
SELECT a.post_id, a.meta_value as lat, b.meta_value as lng
FROM
wp_postmeta as a,
wp_postmeta as b
WHERE a.meta_key = "store_lat"
AND b.meta_key= "store_lng"
AND a.post_id = b.post_id
我还根据用户的当前位置查询“最近的位置”:
SELECT id, ( 6371 * acos( cos( radians(22) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(88) ) + sin( radians(22) ) * sin( radians( lat ) ) ) ) AS distance FROM *** HAVING distance < 1 ORDER BY distance LIMIT 0 , 20;
但我不能加入这两个查询来找到我们的商店。我无法弄清楚用什么代替***
并从wp_posts表中获得所需的商店。
答案
我建议这样的事情:
SELECT
store.post_id AS store_id,
6371 * 2 * ASIN
(
SQRT
(
POWER(SIN((store.lat - ABS(user.lat)) * PI()/180 / 2),2)
+ COS(store.lat * PI()/180) * COS(ABS(user.lat) * PI()/180) * POWER(SIN((store.lng - user.lng) * PI()/180 / 2), 2)
)
) AS distance
FROM (SELECT 0.5 AS lat,
1 AS lng
) AS user,
(SELECT
a.post_id,
a.meta_value AS lat,
b.meta_value AS lng
FROM wp_postmeta AS a,
wp_postmeta AS b
WHERE a.meta_key = "store_lat" AND
b.meta_key = "store_lng" AND
a.post_id = b.post_id
) AS store
ORDER BY distance ASC
LIMIT 0,20
当然,您可以以不同方式移交用户的位置,并应用您的最大距离(例如,距离<1)。
我将距离函数更改为我找到的here
以上是关于如何在MySQL中加入查询以根据距离计算和Google地理编码查找WordPress帖子?的主要内容,如果未能解决你的问题,请参考以下文章