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) 长期修复:调查为什么你有重复的数据点或足够接近重复的数据点。验证您的数据......例如在将新餐厅添加到数据库之前,请使用距离公式检查它是否已经存在。
我针对 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) 长期修复:调查为什么你有重复的数据点或足够接近重复的数据点。验证您的数据......例如在将新餐厅添加到数据库之前,请使用距离公式检查它是否已经存在。