Php 基于距离的搜索与排序

Php 基于距离的搜索与排序,php,mysql,database,Php,Mysql,Database,我正在开发一个PHP&MySql应用程序。以下是我所拥有和正在尝试的: 我有一个带有机构简介的表,其中包含机构名称、邮政编码、地区id、类别和其他详细信息。用户可以根据地区id和类别搜索机构。我可以从category=1和region\u id=1的表中选择*。然后,我需要根据与用户给定邮政编码之间的距离按升序对结果集进行排序。我有一个算法,可以将用户的邮政编码转换为latlong,并找到每个机构之间的距离(表中每个机构都有latlong) 问题是我的桌子很大。当我在上面的场景中搜索时,结果集包

我正在开发一个PHP&MySql应用程序。以下是我所拥有和正在尝试的:

我有一个带有机构简介的表,其中包含机构名称、邮政编码、地区id、类别和其他详细信息。用户可以根据地区id和类别搜索机构。我可以
从category=1和region\u id=1的表中选择*
。然后,我需要根据与用户给定邮政编码之间的距离按升序对结果集进行排序。我有一个算法,可以将用户的邮政编码转换为latlong,并找到每个机构之间的距离(表中每个机构都有latlong)

问题是我的桌子很大。当我在上面的场景中搜索时,结果集包含大约1000行。然后,我必须找到每一行与用户邮政编码之间的距离,然后对其进行排序。现在,它在我的本地网站上运行得很快,但我非常确定,当它上线时,搜索、计算和排序将花费很多时间。然后我想通过一次显示10个结果来解决这个问题,但很明显,这无法解决问题,因为在显示结果之前,我仍然需要计算距离和排序

你认为解决这个问题的最好办法是什么?我想用lat-long的升序进行搜索,但这没有意义,因为lat-long不是线性的。邮政编码是加拿大的。我不知道我是否能利用这一点


让我知道你们的想法。谢谢。

我想你可以试试以下两种方法之一:

  • 使用时,它需要在您的DB模式中进行更改,但我认为这对于您的情况来说是典型的,因此它的性能应该是良好的——应该是这样的
  • 编写查询是为了用SQL计算距离,而不是用PHP,您不希望用一个查询来计算每一个距离,对吗?它将有如下内容(粗略版本):


您可以在查询中计算距离 (这是帕苏多·多德:)

sprintf(“选择地名,MARKER.lat,MARKER.lng,(6371*acos(弧度('%s'))*cos(弧度(lat))*cos(弧度(lng)-弧度('%s'))+sin(弧度('%s')))*sin(弧度(lat)))作为与MARKERtable的区别。。。。
有距离<'%s'、$lat、$lng、$lat、$distance)
其中,$lat和$lan是用户的当前位置(或他选择的地址)。您可以使用默认的$distance或用户选择的一个来过滤查询结果


我在谷歌地图API中使用了它:

这取决于计算距离的方式。如果您不需要为每次比较运行额外的查询(在本例中,您应该能够这样做),那么对服务器来说,排序1000行将是微不足道的,您不必担心。如果您要使用此方法,则需要将公式替换为适用于地理坐标的公式。这两个选项是苹果和桔子,你刚做了一杯水果鸡尾酒!
SELECT ..., sqrt(
    (POW(latitude2 - latitude1, 2)) + 
    (POW(longitude2 - longitude1, 2)) 
 ) AS distance, ...
sprintf("SELECT placeName, MARKER.lat, MARKER.lng, (6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distanza FROM MARKERtable....
HAVING distanza < '%s'", $lat, $lng, $lat, $distance)