3

下面的查询当前在一个循环中(在 PHP 中),该循环从 3 个不同的数组中获取纬度、经度和 id 输入。对于数组中的每个位置/键,使用下面的查询从表中选择最近的地理位置。

由于数组的大小通常在 500 左右,因此需要找到最近的地理位置的 500 组输入需要一些时间。

我的问题:有没有办法一次使用来自 php 的输入数组来使用一个查询,并为每个数组键选择一组所有最近的地理位置?

$sql="SELECT 
id, d, tolon, tolat, du,
       ( 3959 * acos( cos( radians($lat1) ) 
              * cos( radians( travel.tolat ) ) 
              * cos( radians( travel.tolon) - radians($lon1) ) 
              + sin( radians($lat1) ) 
              * sin( radians( travel.tolat ) ) ) ) AS distance 
FROM travel 
WHERE userid = $id AND tolon > $lonlow AND tolon < $lonhigh AND tolat > $latlow AND tolat < $lathigh
having distance < $maxdistance ORDER BY distance
";
4

1 回答 1

1

我认为您不会比一堆工会做得更好,尽管limit 1如果您只需要最接近的,添加 a 是一个好主意。一堆联合将是一个很长的 sql 字符串,并且您可能会遇到限制(max packet size我相信这是设置)。您可能必须一次分块 100 个左右的工会。

如果表具有为此类查询设计的索引,您将获得很多。mysql 支持spatial indexes您应该认真考虑研究,因为常规索引在此用例中表现不佳。

于 2012-05-07T03:30:43.970 回答