MySQL WordPress 查询为某些记录返回零距离

MySQL WordPress Query Returning a Distance of Zero for Some Records

我针对 WordPress 数据库编写了一个查询,该数据库选择了 10 家最近的餐厅,按距离排序。 出于某种原因,前三个的距离为零,我想不通为什么。

有什么想法吗?

这里是 SQL:

    SELECT pm1.post_id, (6371 * acos( cos( radians(51.507351) ) 
                   * cos( radians( pm1.meta_value) ) 
                   * cos( radians(pm2.meta_value) - radians(-0.127758)) + sin(radians(51.507351)) 
                   * sin( radians(pm1.meta_value)))
                 ) AS distance,
           pm1.meta_value AS lat,
           pm2.meta_value as lon
           FROM wp_postmeta AS pm1, 
                wp_postmeta AS pm2,
                wp_posts    AS p 
           WHERE pm1.meta_key = 'latitude' AND pm2.meta_key = 'longitude'
           AND pm1.post_id = pm2.post_id
           AND pm1.post_id = p.id
           AND p.post_status = 'publish' 
           HAVING distance <= 50
           ORDER BY distance ASC
           LIMIT 10;

结果如下:

    post_id  distance              lat                 lon 
    50098    0                     51.507351           -0.127758 
    528181   0                     51.5073509          -0.12775829999998223 
    528183   0                     51.5073509          -0.12775829999998223 
    2193     0.036628788957855186  51.507207           -0.127282 
    2161     0.0605752670106375    51.507312           -0.128631 
    11292    0.18852496145820602   51.5082275731907    -0.130089685072323 
    2157     0.2315552293897031    51.5093632362       -0.12689665526 
    2088     0.2942221944412102    51.5082070105091    -0.12373537807585 
    527740   0.3184070735907211    51.5101623          -0.1286324999999806 
    7075     0.3759866662527897    51.5103             -0.1251 

第一行如您所见正确为零,因为两点相同。

第二行产生的距离为 0,但应该约为 2 厘米。该错误是由您使用的公式引起的;它可能会导致小距离问题。 Google "spherical law of cosines".

第三行的点与第二行的相同。看起来你需要调查(1)短期修复:消除零和几乎为零,例如HAVING distance <= 50 and distance > 0.001 (2) 长期修复:调查为什么你有重复的数据点或足够接近重复的数据点。验证您的数据......例如在将新餐厅添加到数据库之前,请使用距离公式检查它是否已经存在。