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

Php 显示给定半径内的标记(SQL和wordpress),php,sql,wordpress,Php,Sql,Wordpress,考虑以下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

考虑以下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”将不会得到任何结果

我想我需要做某种子查询,但不知道如何做


有人吗?

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

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_Posteta记录同时是纬度和经度,因此您不能(至少,不能像这样简单地)在同一WHERE子句中同时匹配它们。因此,相反,创建两个对wp_postETA表的单独调用,一个用于纬度,一个用于经度,并强制两者匹配(因此是
内部连接,而不是
左连接)。

请看。另外,你没有得到精确的“半径内的标记”,你需要使用或类似的方法进一步过滤结果。我通过大量帮助获得了当前查询,因此你可以更详细吗?我很快地写了我的原始帖子,花了更多的时间来更明确地表达。