Mysql SQL:在给定纬度的不同半径内查找最近点&;经度

Mysql SQL:在给定纬度的不同半径内查找最近点&;经度,mysql,sql,wordpress,Mysql,Sql,Wordpress,到目前为止,我已经能够在同一半径内找到最近的点(本文中的仓库)。(已经有很多答案的常见问题) 这是实际代码(它不使用多个半径) 模式: meta_id | post_id | meta_key | meta_value ------------------------------------------------------ 324802 | 9714 | warehouse_latitude | 47.1978754 324809 | 9715 |

到目前为止,我已经能够在同一半径内找到最近的点(本文中的仓库)。(已经有很多答案的常见问题)

这是实际代码(它不使用多个半径)

模式:

meta_id | post_id | meta_key             | meta_value
------------------------------------------------------
324802  | 9714    | warehouse_latitude   | 47.1978754
324809  | 9715    | warehouse_latitude   | 47.2064462
324814  | 9716    | warehouse_latitude   | 47.214434
324803  | 9714    | warehouse_longitude  | -1.54441
324810  | 9715    | warehouse_longitude  | -1.5461347
324815  | 9716    | warehouse_longitude  | -1.565993
324806  | 9714    | warehouse_radius     | 5
324811  | 9715    | warehouse_radius     | 2
324816  | 9716    | warehouse_radius     | 10

因此,这里是解决方案(根据上一个查询更新)

如果您有更有效/可读的方法来计算距离,请不要介意给另一个anwser

SELECT DISTINCT 
  warehouse_latitude.post_id,
  warehouse_longitude.meta_value as longitude,
  warehouse_latitude.meta_value as latitude,
  warehouse_radius.meta_value as radius,
  ((ACOS(SIN($latitude * PI() / 180) * SIN(warehouse_latitude.meta_value * PI() / 180) + COS($latitude * PI() / 180) * COS(warehouse_latitude.meta_value * PI() / 180) * COS(($longitude - warehouse_longitude.meta_value) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance
FROM {$this->wpdb->postmeta} as warehouse_latitude
  LEFT JOIN {$this->wpdb->postmeta} as warehouse_longitude ON warehouse_latitude.post_id = warehouse_longitude.post_id
  LEFT JOIN {$this->wpdb->postmeta} as warehouse_radius ON warehouse_latitude.post_id = warehouse_radius.post_id 
WHERE warehouse_latitude.meta_key = 'warehouse_latitude' AND warehouse_longitude.meta_key = 'warehouse_longitude' AND warehouse_radius.meta_key = 'warehouse_radius'
HAVING distance < (radius * 0.62)
ORDER BY distance ASC
LIMIT 1
WHERE语句中的另一个条件:

AND warehouse_radius.meta_key = 'warehouse_radius'
因此:

我可以将HAVING语句更新为:

HAVING distance < (radius * 0.62) -- Km to Miles
距离<(半径*0.62)--公里到英里

不是答案。评论太长了

1  LEFT JOIN warehouse_longitude ON ... -- This is an INNER JOIN because of LINE 3
2  LEFT JOIN warehouse_radius ON ...    -- This is also an INNER JOIN, because of LINE 4 
3 WHERE warehouse_longitude.meta_key = 'warehouse_longitude' 
4   AND warehouse_radius.meta_key = 'warehouse_radius'

因此,您不妨先编写这些内部联接。

能否以表格的形式添加示例数据,然后显示预期的输出?这是一个标准的Haversine MySQL查询,但我看不出您在这里想要什么。。。其中x=…与
内部联接x
相同。因此,将条件移到on子句。还有,弧度有什么问题吗?这里有什么问题吗?@草莓当然,我不介意使用弧度,这是我找到的第一个解决方案。@SalmanA有什么问题吗?它可以不受限制地工作,但我只需要得到一个:)。尝试使用
具有距离<(warehouse\u radius.radius*0.62)
确保我可以做到这一点。实际上,我在返回的响应中使用了这个别名(因为我以后可能会使用它;)。同样。谢谢你的意见。我将尝试并更新我的答案:)。
HAVING distance < (radius * 0.62) -- Km to Miles
1  LEFT JOIN warehouse_longitude ON ... -- This is an INNER JOIN because of LINE 3
2  LEFT JOIN warehouse_radius ON ...    -- This is also an INNER JOIN, because of LINE 4 
3 WHERE warehouse_longitude.meta_key = 'warehouse_longitude' 
4   AND warehouse_radius.meta_key = 'warehouse_radius'