在给定半径内显示标记(SQL 和 wordpress)

Posted

技术标签:

【中文标题】在给定半径内显示标记(SQL 和 wordpress)【英文标题】:Show markers within a given radius (SQL and wordpress) 【发布时间】:2013-05-05 23:33:43 【问题描述】:

考虑这个 SQL 查询:

SELECT * FROM 
( 
SELECT * FROM wp_postmeta
WHERE 
(
meta_key = 'latitude' AND meta_value *1 BETWEEN 47.3641471102 AND 47.3731524898) 
OR (meta_key = 'longitude' AND meta_value *1 BETWEEN 8.53253429117 AND 8.54583070883)
) 
AS PostMeta, wp_posts 
WHERE wp_posts.id = PostMeta.post_id order by post_id asc

它为我提供了与某些值之间的纬度或某些值之间的经度匹配的所有记录。我想要得到的是匹配这两个值的记录。 但是将查询中的 'OR' 更改为 'AND' 会给我零结果。

我想我需要做一个子查询,但不知道该怎么做。

有人吗?

【问题讨论】:

看this question。此外,您没有得到确切的“半径内的标记”,您需要使用 Haversine formula 或类似名称进一步过滤结果。 【参考方案1】:

您真的只需要将纬度子查询与经度子查询分开即可。现在我有更多时间,我将更明确地修改查询:

SELECT
    /* You're only interested in the wp_posts data, right? */
    /* You don't care about the data from wp_postmeta. */
    /* Only select the data you're actually going to use. */
    /* Ideally you'd specify each column in wp_posts that you're */
    /* going to use and ignore the rest */
    p.*
FROM
    wp_posts p
        JOIN (SELECT post_id FROM wp_postmeta WHERE meta_key = 'latitude' AND CAST(meta_value AS DECIMAL) BETWEEN 47.3641471102 AND 47.3731524898) lat ON p.id = lat.post_id
        JOIN (SELECT post_id FROM wp_postmeta WHERE meta_key = 'longitude' AND CAST(meta_value AS DECIMAL) BETWEEN 8.53253429117 AND 8.54583070883) long ON p.id = long.post_id
ORDER BY
    post_id ASC

...因为没有单个 wp_postmeta 记录既是纬度又是经度,您不能(至少,不像这样简单)在同一个 WHERE 子句中匹配它们。因此,改为对 wp_postmeta 表创建两个单独的调用,一个用于纬度,一个用于经度,然后强制它们都匹配(因此是 INNER JOIN,而不是 LEFT JOIN

【讨论】:

我通过很多帮助得到了当前的查询,您能否更详细一点? 快速写了我的原始帖子,花了一点时间来更明确。

以上是关于在给定半径内显示标记(SQL 和 wordpress)的主要内容,如果未能解决你的问题,请参考以下文章

如何仅在地图上的半径(圆圈)内显示标记?

PHP SQL查询以查找纬度和经度的给定半径内的所有零售商

SQL查询位置半径内的总点数

在原点的给定半径范围内和外部生成随机坐标

显示用户在PHP中当前位置的10公里半径范围内的用户

SQL 距离和半径突出显示