【发布时间】:2018-09-11 08:02:08
【问题描述】:
到目前为止,我已经能够在同一半径内找到最近的点(本文中的仓库)。 (已经有很多答案的常见问题)。
这是实际代码(不使用多个半径)
$radius = 5; // miles
$q = "
SELECT DISTINCT
warehouse_latitude.post_id,
warehouse_longitude.meta_value as longitude,
warehouse_latitude.meta_value as latitude,
((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
WHERE warehouse_latitude.meta_key = 'warehouse_latitude' AND warehouse_longitude.meta_key = 'warehouse_longitude'
HAVING distance < $radius
ORDER BY distance ASC
LIMIT 1
";
改为:
我想选择最近的点,但为每个点定义了半径(仓库)。
- A 点 (9714):半径 5 英里
- B 点 (9715):半径 2 英里
- 点 C (9716):半径 10 英里
所以如果 B 点和 C 点在范围内,并且 B 点最近,它应该选择 B 点。
wp_postmeta 表:
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
架构:
【问题讨论】:
-
能否以表格的形式添加样本数据,然后显示预期的输出?这是一个标准的 Haversine MySQL 查询,但我在这里看不到您想要的确切内容。
-
Left join x... where x=...与inner join x相同。因此,请将条件移至 on 子句。另外,弧度有什么问题? -
这里有什么问题?
-
@Strawberry 当然,我不介意使用弧度,这是我找到的第一个解决方案。
-
@SalmanA 有什么问题吗?它可以在没有 LIMIT 的情况下工作,但我只需要得到一个 :)。