Php 如何使用一个Mysql查询而不是数组循环内的查询?

Php 如何使用一个Mysql查询而不是数组循环内的查询?,php,mysql,Php,Mysql,下面的查询当前位于一个循环(在PHP中)中,该循环从3个不同的数组获取纬度、经度和id输入。对于数组中的每个位置/键,使用下面的查询从表中选择最近的地理位置 由于阵列的大小通常在500左右,因此500组输入(需要找到最近的地理位置)需要一些时间 我的问题:有没有办法一次使用php中的输入数组使用一个查询,并为每个数组键选择一组最近的地理位置 $sql="SELECT id, d, tolon, tolat, du, ( 3959 * acos( cos( radians($lat

下面的查询当前位于一个循环(在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
";
$sql=“选择
id,d,托伦,托拉特,杜,
(3959*acos(cos(弧度($lat1))
*cos(弧度(travel.tolat))
*cos(弧度(旅行托伦)-弧度($1))
+sin(弧度($lat1))
*sin(弧度(travel.tolat))作为距离
旅行
其中userid=$id和tolon>$lonlow和tolon<$lonhigh和tolat>$latlow和tolat<$lathigh
距离小于按距离排序的最大距离
";

我不认为你会比一群工会做得更好,尽管如果你只需要最接近的工会,增加一个
限制1
是个好主意。一组联合将是一个非常长的sql字符串,您可能会遇到一些限制(
max packet size
是设置,我相信)。你可能需要一次组织100个左右的工会


如果表中有针对这种查询类型设计的索引,您将获得很多好处。MySQL对于空间索引有很好的支持,你应该认真考虑一下,因为常规索引对这个用例不太好。

更坏的情况是联盟,但是有些人会发布更好的想法。您是否尝试过..或..我会尝试将数组插入临时表,然后可以使用常规联接。至少这是一个起点@ingo很难将它们连接起来,因为连接是由两个表中地理坐标之间的最小距离定义的,这是通过公式计算的。如果数据库支持横向查询,则不需要循环。不幸的是,我所知道的具有横向功能的数据库是DB2和SQL Server。在SQL Server中,它被称为交叉应用或外部应用。Postgresql也计划支持横向。参见示例:一个外部应用演练除了这个答案之外,我还使用了数组中的唯一值来限制数据库中所需的记录数。