2014-04-01 41 views
0

我正在研究PHP & MySql应用程序。这里是我有和正在尝试做的:基于距离的搜索和排序

我有一个机构配置文件,其中包含机构名称,邮政编码,region_id,类别和其他详细信息表。用户可以根据region_id和类别搜索一个机构。我可以SELECT * FROM TABLE WHERE category = 1 and region_id = 1。然后,我需要根据距邮政编码升序的用户距离对结果集进行排序。我有一个算法,将用户postal_code转换为latlong,并找到每个机构的距离(对于表中的每个机构,我都有很长的距离)。

问题是我的桌子很大。当我在上面的场景中搜索时,结果集包含大约1000行。然后,我必须从用户postal_code中找到每行的距离,然后对其进行排序。现在,它在我的本地速度很快,但我确信当它开始运行时,搜索,计算和排序需要很长时间。然后,我想通过一次显示10个结果来解决问题,但是很明显,这并不能解决问题,因为我仍然必须计算距离并进行排序,然后才能显示结果。

您认为最好的解决方法是什么?我正在考虑按照lat的升序进行搜索,但由于lat的长度不是线性的,所以这没有意义。邮政编码是加拿大的。我不知道我能否以某种方式利用它。

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

+0

这取决于你计算距离的方式。如果您可以在不对每次比较运行额外查询的情况下执行此操作(在这种情况下您应该可以执行此操作),那么对服务器排序1000行对于您而言无关紧要,您无需担心。 – Vatev

回答

0

我想你可以尝试这些两两件事之一:

  • 使用MySQL spatial support,它需要在你的DB模式的变化,但我认为这是典型的为你的情况,因此它的性能应该不错 - 按说。
  • 编写查询来计算SQL中的距离,而不是PHP,你不希望单个查询计算每一个距离,对吗?它将有这样的事情(粗略的版本):

    SELECT ..., sqrt(
        (POW(latitude2 - latitude1, 2)) + 
        (POW(longitude2 - longitude1, 2)) 
    ) AS distance, ... 
    
+0

如果你打算使用这个,你需要用一个与地理坐标一起工作的公式来代替公式。 – Vatev

+0

这2个选项是苹果和橘子,你刚刚做出了水果鸡尾酒! –

0

可以计算距离在查询 (这是一个pasudo核桃:)

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) 

其中$ lat和$ lan是用户的当前位置(或由他选择的地址)。您可以使用默认$距离或用户选择的一个过滤查询结果。

我在谷歌地图API中使用它:https://developers.google.com/maps/articles/phpsqlsearch_v3